2010-04-02 50 views
1

我有一個模型Django應用程序如下:Django的兩個約束條件篩選的相關模型

  • 一個Question模型

  • Answer模式,用一個ForeignKey 回到剛纔的問題。 (一個問題可以 有多個答案。)

  • 一個Flag模式,用一個ForeignKey到 應答。 (一個答案可以被標記 爲不適當。)

所有上述的也有一個user字段,定義創建該對象的用戶。

我試圖從當前用戶已被標記的答案得到所有問題的列表。我嘗試這樣做:

Question.objects.filter(answer__user=user).\ 
       filter(answer__flag__isnull=False).distinct() 

...但我相信,這將返回從當前用戶,並與已標記的答案正確答案的問題的列表,但不一定會保證它是用戶的答案已經被標記。

有沒有簡單的方法來做到這一點?基本上,我想讓answer過濾器的一部分在兩者上都指向相同的答案。

請讓我知道,如果有什麼不清楚。

回答

6

該查詢完全是你想要的,除了你應該過濾標記爲而不是null的問題。鏈接過濾器是and編輯在一起,所以它會過濾掉所有有特定用戶答案的​​問題,然後過濾該標記的答案。

你也可以把那些兩個標準在同一filter電話:

Question.objects.filter(answer__user=user, answer__flag__isnull=False) 
+0

我不知道我明白。第一個過濾器會給我一組所有的問題,至少有一個來自該用戶的答案。然後,第二個過濾器將返回符合標準答案的問題。但是,如果問題Q1分別具有來自用戶U1和U2的答案A1和A2,並且標記了A2,那麼這個查詢是否不會爲U1和U2返回Q1? 是的,你完全正確的關於isnull = False;我會解決這個問題。 – 2010-04-02 16:09:50

+1

啊哈。事實證明,如果我把它們都放在同一個過濾器調用中,那麼它會做我想要的。 (有關更多信息,請參見http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships。) – 2010-04-02 17:13:32

+0

請注意,根據文檔,這不起作用'.exclude()'相同 – 2016-10-27 14:08:39

0

如何:

questions = [a.question for a in user.answer_set.filter(flag__isnull=True)] 

編輯:這不返回的查詢集,當然。爲了避免重複的問題,可以將列表理解包含在set()中。

+0

我這樣做,其實需要的是一個QuerySet,因爲這可能會進一步篩選後進行冒充。 – 2010-04-02 16:11:04