2011-04-07 76 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

相关问题