查询Django中ManyToManyField的确切内容

时间:2012-02-04 06:07:34

标签: django many-to-many

如何通过检查其manyToManyField关系完全的成员是否与给定的对象列表匹配来查询对象?

例如,给定

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

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)

我希望得到所有配有意大利辣香肠和洋葱的披萨:

pep = Topping(name='pepperoni')
pep.save()
onion = Topping(name='onion')
onion.save()
tops = [pep, onion]
p = Pizza.objects.filter(toppings__eq=tops)

Django提供__in运算符,但不提供__eq。我该如何做等效的?

感谢。

2 个答案:

答案 0 :(得分:1)

如何筛选所有浇头,然后确保选择与您指定的浇头数完全相同的披萨。

from django.db.models import Q
import operator
pizza = (Pizza.objects
    .filter(reduce(operator.or_, [Q(toppings=topping) for topping in tops]))
    .annotate(count=Count('toppings'))
    .filter(count=len(tops))
    )

答案 1 :(得分:-2)

只需将过滤器链接起来即可获得所需内容:

pep = Topping(name='pepperoni')
pep.save()
onion = Topping(name='onion')
onion.save()
tops = [pep, onion]
p = Pizza.objects.filter(toppings__id=pep.id).filter(toppings__id=onion.id)

我没有遇到过更好的方法。