2010-01-13 69 views
7

許多關係我有模型對象的這種結構:篩選許多以在Django

A類:
b = models.ManyToManyField("B") 
B類:
c = models.ForeignKey("C") 
d = models.ForeignKey("D") 
C類:
d = models.ForeignKey("D") 

這是查詢我試圖得到:
我想獲得對象A的所有B對象,然後在每個B對象中執行D對象和cd對象之間的比較。

我知道,只需在for循環中移動B集合並進行比較即可。 但我跳入水中的多對多關係,後來我發現我可以做到以下幾點:

bObjects = A.objects.all().b 

q = bObjects.filter(c__d=None) 

這是工作,它給了我所有None d領域的C對象。但是,當我嘗試以下方法:

q = bObjects.filter(c__d=d) 

它給了我ð沒有定義,但d就像對象B.

可以採取什麼問題℃的對象?如果您提出進一步的方法來完成這項任務,我會很高興。 我通常我試圖用多到多個子對象在單個操作中編寫我的查詢,而不是使用循環。

+1

這一切ABC是混淆了你能不能選擇更好的名稱:d? – maazza 2013-06-10 09:50:57

回答

6

q = bObjects.filter(c_d=d) //Give me d not defined. but d is an object like c in the object B.

試試這個:

from django.db.models import F 
q = bObjects.filter(c__d=F('d')) 

至於從您的評論的問題,下面你可以有一個SQL語句,而不是100在這些方面:

1)如果你可以表達你的選擇A查詢(例如a.price < 10和a.weight> 20)的使用:

B.objects.filter(a__price__lt=10, a__weight__gt=20, c__d=F('d')) 

或本:

B.objects.filter(a__in=A.objects.filter(price__lt=10, weight__gt=20), c_d=F('d')) 

2)如果你只是有一個對象的Python列表,使用此:

B.objects.filter(a__pk__in=[a.pk for a in your_a_list], c__d=F('d')) 
+0

感謝分配,它的工作原理。還有一個問題:如果我有主對象A的對象列表,我可以使用一行來寫查詢,而不是遍歷A列表並執行相同的操作。 只是我想保存點擊數據庫ID我有100的A,那麼我必須使查詢100次。 謝謝 – Wasim 2010-01-13 12:20:17

+0

Wasim,添加.select_related('a')到您的查詢的傾向 – 2010-01-13 12:56:49

+0

非常感謝,它的工作原理。 注意:如果我寫B.objects.filter(a__in = A.objects.filter(price__lt = 10,weight__gt = 20).query,c_d = F('d'))。它引發錯誤SQL錯誤:操作數應該包含1列。 我看着生成的SQL,然後而不是.query我用.all替換它,這解決了這個問題。 再次感謝。 – Wasim 2010-01-17 13:03:09