Включение фильтров администратора Django на полях "многие-ко-многим"

У меня есть простая модель Django, похожая на:

class Address(models.Model):
    blah

class MemberData(models.Model):
    user = models.ForeignKey(User)
    addresses = models.ManyToManyField(Address)

Я хочу показать модель Address в admin, чтобы пользователь мог фильтровать записи адресов их ассоциированным пользователем. например.

class AddressAdmin(admin.ModelAdmin):
    model = Address
    list_filter = [???]

Свойство ModelAdmin.list_filter позволяет это, но я не уверен, какое имя поля использовать для поддержки отношений "многие-ко-многим". Если модель Address имеет прямую ссылку на модель MemberData, я могу сделать что-то вроде:

class AddressAdmin(admin.ModelAdmin):
    model = Address
    list_filter = ['memberdata__user']

Существует ли эквивалентный синтаксис для косвенных отношений "многие ко многим"? Если нет, есть ли способ обхода одного и того же конца?

Ответы

Ответ 1

Я верю в такой случай, вы можете создать тривиальную модель through для вашего отношения M2M, а затем использовать обычный синтаксис, чтобы следовать (теперь явным) ForeignKey s. Что-то вроде:

class Address(models.Model):
    blah

class MemberData(models.Model):
    user = models.ForeignKey(User)
    addresses = models.ManyToManyField(Address,through='MemberAddress')

class MemberAddress(models.Model):
    member = models.ForeignKey(MemberData)
    address = models.ForeignKey(Address)

и в admin:

class AddressAdmin(admin.ModelAdmin):
    model = Address
    list_filter = ['memberaddress_set__member__user']

Ответ 2

Я использую 1.5, а list_filter = ['memberdata__user'] похоже, что это сработает.