Отображение отношений "многие-ко-многим" в Django
Вопрос: У меня есть следующие модели для приложения по управлению посетителями. Каждый сайт может иметь несколько посетителей, и каждый посетитель может посещать несколько сайтов. Я не могу найти способ показать список посетителей на каждом сайте или показать список сайтов, которые посетил посетитель. Я удалил ненужные поля
.models.py
class Site(models.Model):
name = models.CharField(max_length=100, unique=True)
accomodation = models.BooleanField(default=False)
visitors = models.ManyToManyField('Visitor', blank=True)
class Visitor(models.Model):
name = models.CharField(max_length=50, null=False, blank=False)
email = models.EmailField(max_length=200, null=False, blank=False, unique=True)
...
admin.py
class AdminArea(admin.AdminSite):
vms_admin = AdminArea(name='vms_admin')
@admin.register(Site, site=vms_admin)
class SiteAdmin(admin.ModelAdmin):
fieldsets = (*removed*)
list_display = [*removed*]
list_filter = (*removed*)
@admin.register(Visitor, site=vms_admin)
class VisitorAdmin(admin.ModelAdmin):
fieldsets = (*removed*)
list_display = [*removed*]
list_filter = (*removed*)
Django Admin
Вот как выглядит список сайтов: Django Admin Site List
Вот как выглядит список посетителей: Django Admin Visitor List
Вопрос. Как показать список посетителей для каждого сайта и наоборот? Например: Если я нажимаю на Гингинский гравитационный участок, я хочу увидеть список посетителей, связанных с ним, в таблице, под "деталями сайта". Аналогично показанному списку посетителей, но конкретно для этого участка. Django Admin Specific Site
Прежде всего, я бы сделал имя related_name явным в модели Site. Это не является строго необходимым, существует обратная ссылка по умолчанию, созданная Django, я просто никогда не помню ее название, поэтому мне нравится быть явным.
visitors = models.ManyToManyField('Visitor', blank=True, related_name='sites')
Предполагаю, что вы хотите видеть список сайтов при нажатии на отдельного посетителя, другими словами, на странице администрирования подробностей о посетителе. В таком случае все, что вам нужно сделать, это указать поле sites
в VisitorAdmin. И наоборот, для отображения посетителей в SiteAdmin. Тогда вы получите список всех посетителей, в котором будут выбраны активные.
class SiteAdmin(Admin):
fieldsets = (
('Visitors', {'fields': ('visitors')})
)
Если вы хотите отобразить (возможно, длинный) список сайтов на странице администрирования списка посетителей, вы можете определить свойство модели Visitor и добавить это свойство в list_fields
.
class Visitor(Model):
@property
def list_of_sites(self):
return self.sites.all().values_list(name, flat=True)
class SiteAdmin(Admin):
list_display = ['name', 'accomodation', 'list_of_sites']