过滤 ManyToManyField 中间表字段

Posted

技术标签:

【中文标题】过滤 ManyToManyField 中间表字段【英文标题】:Filter on ManyToManyField intermediate table fields 【发布时间】:2013-03-14 01:23:39 【问题描述】:

我有一个普通的 M2M,中间表中有一个附加字段:

class Customer(models.Model):
    items = models.ManyToManyField(Item, verbose_name=u'Items', through='CustomerItem')

class Item(models.Model):
    pass

class CustomerItem(models.Model):
    item = models.ForeignKey(Item, related_name='customer_items')
    customer = models.ForeignKey(Customer, related_name='customer_items')
    item_count = models.PositiveIntegerField(default=0)

我想获得一个查询集,其中包含给定客户的所有项目,其中item_count > 0。到目前为止,我发现的唯一方法(来自here)是过滤中间表,然后使用 Python 代码制作对象列表,但我需要一个查询集(用于ChoiceField 的表单)。

【问题讨论】:

items = Item.objects.filter(customer_items__customer=customer, customer_items__item_count__gt = 0) 工作吗? @Bibhas 似乎工作,请写一个答案 【参考方案1】:

这里-

items = Item.objects.filter(customer_items__customer=customer, customer_items__item_count__gt = 0)

您已将 related_name='customer_items' 添加到 Item 外键。您可以通过item.customer_items 访问与任何Item 相关的CustomerItem。休息是小菜一碟。

【讨论】:

【参考方案2】:

这个呢?

Customer.object.filter(customeritem__item_count__gt=0)

【讨论】:

以上是关于过滤 ManyToManyField 中间表字段的主要内容,如果未能解决你的问题,请参考以下文章

正在对ManyToManyField的列进行过滤?

如何在不覆盖 ModelForm 中的字段定义的情况下将 ManyToManyField 小部件更改为 CheckboxSelectMultiple

多表对多表的添加

Django ManyToMany 通用“通过”模型

如何过滤 Django ModelForm 中的 ManyToManyField 选项?

ManyToManyField对象上的Django可变数量的过滤器?