【问题标题】:Using filter in a query with 2 ManyToMany fields in Django在 Django 中具有 2 个 ManyToMany 字段的查询中使用过滤器
【发布时间】:2011-04-07 22:24:46
【问题描述】:

我会尽力描述我在这里尝试做的事情。 我有 3 节课:

  • 问题
  • 问题类型
  • 问题模板

关系是:

  • 问题 QuestionType
  • QuestionTemplate QuestionType

因此,查询位于 QuestionTemplate 内的一个方法中,该方法为我提供了可能问题的列表,这些问题具有与 QuestionTemplate 相关的相同 QuestionType。

我试过了:questions = Question.objects.filter(type__in = template.type.all()) 其中“模板”是 QuestionTemplate 对象。 但是这个查询返回给我在模板的 QuestionType 列表中至少有一个 QuestionType 的问题。 我想要做的是在问题和模板中获得完全相同的 QuestionTypes。

我尝试了很多东西,但无法让这个工作,请有人救救我!

【问题讨论】:

  • 请说明你想要得到什么。您正在尝试获得与...中完全相同的问题?我认为您在最初的帖子中留下了几句话。
  • 我想在给定的 QuestionTemplate 上获取与 QuestionType 具有相同(完全)连接的问题。因此,如果我得到一个具有 QuestionType = (Type1, Type2 和 Type3) 的模板,查询将返回与 QuestionType = (Type1, Type2, Type3) 有连接的所有问题。因此,与 QuestionType 有不同连接的任何其他问题,例如(Type1、Type2 和 Type5)都不会进入列表。对于具有 QuestionTypes =(Type1 和 Type2)的问题也是如此,因为它没有有像模板一样的Type3,它也会被丢弃。

标签: django filter many-to-many field


【解决方案1】:
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)

相当笨拙,但应该做你需要的。

【讨论】:

  • 就性能而言,最好只使用过滤器/排除而不是对列表进行迭代检查是否可以?
  • @Arruda:过滤/排除在数据库中进行所有计算,所以这总是更快,通常是十倍。但我想不出纯过滤/排除的解决方案。也许你可以在原始 SQL 中做到这一点。但是在优化之前,请确保它实际上是一个性能瓶颈。如果不是这样,可以为您节省大量时间。
  • 我想知道这个的主要原因是因为我想学习如何面对这样的问题......这个解决方案很适合我现在遇到的问题,但也许将来我会面临另一种只能通过查询来处理,所以我想知道如何做到这一点。
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 2016-04-11
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2021-06-07
相关资源
最近更新 更多