Отображение отношений "многие-ко-многим" в 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']
Вернуться на верх