Question

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'))
Was it helpful?

Solution

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.

OTHER TIPS

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, )
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top