如何通过检查其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
。我该如何做等效的?
感谢。
答案 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)
我没有遇到过更好的方法。