【问题标题】:OR query with Q object hanging或查询 Q 对象挂起
【发布时间】:2012-03-24 06:19:56
【问题描述】:

我正在使用 Q 对象构造一个查询,但它挂起。

当我将过滤器“与”在一起时,查询工作正常。示例如下:

School.objects.filter( Q(city__search='"orlando"'), Q(schoolattribute__attribute__name__search='"subjects"') )

但是当我将过滤器“或”在一起时,查询会挂起,因为我假设要处理的内容太多:

School.objects.filter( Q(city__search='"orlando"') | Q(schoolattribute__attribute__name__search='"subjects"')

我想知道这里到底发生了什么,我能做些什么来缓解它。为什么使用“AND”时查询有效,而使用“OR”时查询无效?

编辑:很好的提示@psagers。所以事实证明,AND 查询获得了两个 INNER JOIN,而 OR 查询获得了两个 LEFT OUTER JOIN。

【问题讨论】:

  • 如有疑问,请转到 SQL。我建议构建查询集,然后从 query 属性中获取原始 SQL。如果仍然不清楚,您可以将其插入您的数据库引擎并要求它为您分析性能。见stackoverflow.com/questions/3748295/…

标签: django django-q


【解决方案1】:

鉴于你的情况,我会假设如下:

  1. 你有一个非常大的数据集
  2. 您不想获取太多条目

要优化代码,最好使用两个查询:

schools_by_city = School.objects.filter(city__search='"orlando"')
schools_by_attribute_city = School.objects.filter(schoolattribute__attribute__name__search='"subjects"')
result = set(schools_by_city).union(set(schools_by_attribute_city))

这将可能比您的原始查询更好(因为您可以使用 INNER 连接),但您应该对其进行测试。如果我的假设是错误的,你可能应该重新考虑你的数据库结构(即使用专门的工具来搜索而不是 mysql 全文,重新考虑SchoolAttribute,无论你的船是什么)。

【讨论】:

  • 你的假设是正确的。这是我第一次处理集合,Python 显然不喜欢 + 运算符。我应该改用什么?
  • 谢谢。不幸的是,将这些集合放在一起需要相当多的处理时间。
  • 好吧,我想一次显示 400 个条目,但问题是这些初始集可能包含数千个。
猜你喜欢
  • 2015-05-13
  • 2017-09-16
  • 2015-06-23
  • 2010-12-27
  • 2014-02-06
  • 2015-07-15
  • 2021-09-15
  • 1970-01-01
  • 2013-12-11
相关资源
最近更新 更多