Django Admin中的一对一字段

5 投票
2 回答
14847 浏览
提问于 2025-04-17 21:00

已编辑为使用一对一字段

我想在Django的模型管理中添加一个建筑物的面积。表格结构是

class Area(models.Model):
    id= models.IntegerField('Buildings', db_column='id')
    area=models.FloatField(blank=True, null=True)

class Buildings(models.Model):
    id = models.AutoField(primary_key=True)
    auto_sf = models.OneToOneField(Area, db_column='id')

我知道可以通过以下方式访问面积属性

b=buildings.get(id=1)
print(b.area.area)

但是我不明白如何将b.area.area加入到模型管理中——因为这样做不行。

class AdminSection(admin.ModelAdmin):
        
    def area(self, obj):
           return obj.area.area

    fields=(('id','area'))

2 个回答

-1

如下所示,如果"Building"类有一个"models.OneToOneField()"指向"Area"类,这意味着"Building"类有一个外键指向"Area"类

# "models.py"

from django.db import models

class Area(models.Model):
    name = models.CharField(max_length=100)

class Building(models.Model):
    name = models.CharField(max_length=100)
    area = models.OneToOneField( # Here
        Area, 
        on_delete=models.CASCADE,
        primary_key=True
    )

那么,你可以把"Building"类放在"Area"类下面,如下所示:

# "admin.py"

from django.contrib import admin
from .models import Area, Building

class BuildingInline(admin.TabularInline):
    model = Building

@admin.register(Area)
class AreaAdmin(admin.ModelAdmin):
    inlines = (BuildingInline, )

如下所示,如果"Area"类有一个"models.OneToOneField()"指向"Building"类,这意味着"Area"类有一个外键指向"Building"类

# "models.py"

from django.db import models

class Building(models.Model):
    name = models.CharField(max_length=100)
    
class Area(models.Model):
    name = models.CharField(max_length=100)
    area = models.OneToOneField( # Here
        Building, 
        on_delete=models.CASCADE,
        primary_key=True
    )

那么,你可以把"Area"类放在"Building"类下面,如下所示:

# "admin.py"

from django.contrib import admin
from .models import Area, Building

class AreaInline(admin.TabularInline):
    model = Area

@admin.register(Building)
class BuildingAdmin(admin.ModelAdmin):
    inlines = (AreaInline, )
5

如上所述,你想使用一种叫做内联模型管理的功能,像这样:

class AreaInline(admin.StackedInline):
    model = Area
class BuildingAdmin(admin.ModelAdmin):
    inlines = (AreaInline, )
admin.site.register(Building, BuildingAdmin)

另外,你的模型最好用单数名称,比如Building,这样更符合语义——例如,一个建筑有一个面积。除非Buildings对象确实是在管理每个实例的多个建筑。

撰写回答