سؤال

Edited to use a one-to-one field

I'd like to add the area of a building to a django modeladmin. The table structure is

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')

I know that I can access the area attribute by using

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

But I don't understand how to incorporate b.area.area into the modeladmin - since this doesn't work.

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

    fields=(('id','area'))
هل كانت مفيدة؟

المحلول

As stated, you are looking to use an inline model admin, like so:

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

Also, your models should ideally have singular names, i.e. Building, to make the more semantic sense - e.g. A building has an area. Unless the Buildings object is literally managing multiple buildings per instance.

نصائح أخرى

As shown below, if "Building" class has "models.OneToOneField()" referring to "Area" class which means "Building" class has the ForeignKey referring to "Area" class:

# "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
    )

Then, you can inline "Building" class under "Area" class as shown below:

# "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, )

As shown below, if "Area" class has "models.OneToOneField()" referring to "Building" class which means "Area" class has the ForeignKey referring to "Building" class:

# "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
    )

Then, you can inline "Area" class under "Building" class as shown below:

# "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, )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top