Django: 对ManyToManyField的*所有*值进行queryset过滤

4 投票
1 回答
1794 浏览
提问于 2025-04-15 14:28

你好(抱歉我的英语不好 :p)

想象一下这些模型:

class Fruit(models.Model):
    # ...

class Basket(models.Model):
    fruits = models.ManyToManyField(Fruit)

现在我想获取与所有水果相关的购物篮实例。问题是下面的代码返回的是与任何水果相关的购物篮实例:

baskets = Basket.objects.filter(fruits__in=Fruit.objects.all())

# This doesn't work:
baskets = Basket.objects.filter(fruits=Fruit.objects.all())

有没有什么解决这个问题的方法呢?

非常感谢你。 :)

1 个回答

6

我手头没有数据集来测试这个,不过我觉得应该可以用:

Basket.objects.annotate(num_fruits=Count('fruits')).filter(num_fruits=len(Fruit.objects.all()))

这个代码会给每个篮子对象加上相关水果的数量,并且过滤掉那些水果数量等于总水果数量的篮子。

注意:你需要使用Django 1.1版本才能让这个工作。

撰写回答