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