2012-02-04 65 views
1

如何通过检查其manyToManyField关系刚好的成员是否与给定的对象列表相匹配来查询对象?查询Django中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

刚刚链中的过滤器,以获得想要的东西:

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) 

我还没有遇到一个更好的方式来做到这一点。

+1

这似乎不起作用。这仍然会接受比萨饼,有其他配料 – Neil 2012-02-04 09:41:17

1

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

​​
+0

比较复杂的东西看似简单。任何其他想法? – Neil 2012-02-06 11:30:08

+0

@NP。,对不起,我没有其他想法来确保您获得完全匹配。 “找到所有配有XYZ和正好len(XYZ)配料的比萨饼” – 2012-02-06 17:35:23

+0

只是为了评论我认为operator.or_的使用是错误的逻辑。由于浇头长度是相等的,并且Q对象的'或'评估评估结果为'[''Sausage','Pepperoni']',所以匹配'['Onion','Pepperoni']的查询匹配对象当匹配'主题='Pepperoni''时是真的。你想连续筛选每一个顶点来实现'和'比较。 – garromark 2014-08-26 06:14:11