在多对多字段上启用Django Admin过滤器

16 投票
2 回答
8776 浏览
提问于 2025-04-16 13:59

我有一个简单的Django模型,长得像这样:

class Address(models.Model):
    blah

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

我想在后台管理中显示地址模型,这样用户就可以根据关联的用户来过滤地址记录。例如:

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

ModelAdmin.list_filter这个属性可以实现这个功能,但我不太确定应该用哪个字段名来支持我这个多对多的关系。如果地址模型直接引用了MemberData模型,我可以这样做:

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

那么,对于间接的多对多关系,有没有类似的语法呢?如果没有,有没有其他方法可以实现同样的效果?

2 个回答

5

我正在使用1.5版本,list_filter = ['memberdata__user']看起来可以用。

9

我认为在这种情况下,你可以为你的多对多关系创建一个简单的 through 模型,然后使用正常的语法来跟踪(现在是明确的) ForeignKey。大概是这样的:

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)

然后在管理后台:

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

撰写回答