2012-02-04 89 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