Django Admin: Как использовать поле OneToMany внутри list_display?

При выводе списка модели "Дом" в панели администратора django я хочу показать все дома, но с почтовым индексом внутри list_display, чтобы я мог сортировать их по почтовому индексу. Могу ли я использовать существующую связь ForeignKey между House и HouseAddress для достижения этой цели?

Я нашел некоторую информацию о том, как перечислить части "Домов" внутри представления списка "Адреса домов" (поскольку в нем есть поле внешнего ключа), но не из представления списка "Дома".

Admin.py

class HouseAdmin(admin.ModelAdmin):
    search_fields = ['Name']
    list_display = ['Name']

class HouseAddressAdmin(admin.ModelAdmin):
    search_fields = ['PostalCode']

    model = HouseAddress
    list_display = ['PostalCode']

Model.py

class House(models.Model):
    Name = models.CharField(max_length=150, null=True, blank=False)




class HouseAddress(models.Model):
    PostalCode = models.CharField(max_length=30, null=True, blank=True)
    AddressInfo = models.ForeignKey(House, null=True, blank=True, on_delete=models.CASCADE, related_name='fa')


Возможно, вы сможете добиться чего-то близкого к тому, что вам нужно (или хотя бы полезного) с помощью list_filter, используя что-то вроде:

class HouseAdmin(admin.ModelAdmin):
    search_fields = ['Name']
    list_display = ['Name']
    list_filter = ['fa__PostalCode']

Это даст вам боковую панель, где вы можете нажать на почтовый индекс и отфильтровать дома в этом коде. list_filter также обеспечит сортировку по умолчанию.

Надеюсь, я понял, что именно вы хотите сделать. Ниже приведено изображение конечного результата.

Admin.py

from django.contrib import admin
from .models import House, HouseAddress


@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
    search_fields = ['name']
    list_display = ['name', 'get_postal_code']

    def get_postal_code(self, obj):
        return ", ".join([qs.postalcode for qs in obj.fa.all()])


@admin.register(HouseAddress)
class HouseAddressAdmin(admin.ModelAdmin):
    search_fields = ['postalcode']

    model = HouseAddress
    list_display = ['postalcode']

Результат: enter image description here

Вернуться на верх