2011-04-07 79 views
0

我會盡我所能來描述我在這裏要做的事情。 我有3類:在帶有Django中的2個ManyToMany字段的查詢中使用過濾器

  • 問題
  • QuestionType
  • QuestionTemplate

而且關係是:

  • 問題< -ManyToMany-> QuestionType
  • QuestionTemplate < -ManyToMany-> QuestionType

所以查詢是在內部QuestionTemplate了一種方法,讓我那有都跟QuestionTemplate相同QuestionType可能出現的問題的列表。

我試過了:questions = Question.objects.filter(type__in = template.type.all()) 其中「template」是一個QuestionTemplate對象。 但是,這個查詢返回給我的是模板中的QuestionType列表中至少有一個QuestionType的問題。 我想要做的是讓問題和模板中的問題類型完全相同。

我嘗試了很多事情,但無法得到這個工作,請,有人救了我!

+0

請澄清你想要得到什麼。你試圖得到在......中完全相同的問題?我想你在你最初的帖子中留言了幾句。 – DTing 2011-04-07 22:49:27

+0

我想在給定的QuestionTemplate上得到與QuestionType具有相同(精確)連接的問題。 因此,如果我得到一個具有QuestionType =(Type1,Type2和Type3)的模板 查詢將返回所有連接QuestionType =(Type1,Type2,Type3)的問題。 因此,與QuestionType具有不同連接的任何其他問題(例如Type1,Type2和Type5)都不會進入列表。 同樣的問題具有QuestionTypes =(Type1和Type2),因爲它沒有像模板那樣的Type3,它也會被拋出。 – Arruda 2011-04-10 02:26:57

回答

0
types = template.type.all() 
query = Question.objects 
for t in types: 
    query = query.filter(type = t) 
questions = [] 
for q in query.select_related('type'): 
    ok = True 
    for t in q.type.all(): 
     if t not in types: 
      ok = False 
      break 
    if ok: 
     questions.append(q) 
save_questions_in_m2m_relations_so_that_you_dont_have_to_repeat_this(questions) 

很笨拙,但應該做你所需要的。

+0

在性能方面,僅僅使用過濾/排除而不是通過列表檢查來檢查一個是否可行,是否更好? – Arruda 2011-04-09 14:38:00

+0

@Arruda:過濾/排除可以完成數據庫中的所有計算,因此總是更快,通常爲十倍。但我無法想象純粹的過濾器/排除的解決方案。也許你可以用原始SQL做。但是在優化**之前,請確保它實際上是一個性能瓶頸。如果不是,可以節省很多時間。 – jammon 2011-04-09 17:05:30

+0

我想知道這一點的主要原因是因爲我想學習如何面對這樣的問題... 這個決議將適合我現在的問題,但也許在將來我面對另一個只能是處理querys所以我想知道如何做到這一點。 – Arruda 2011-04-10 02:09:37

相關問題