Включение фильтров администратора 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']
похоже, что это сработает.