0

我正在使用 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。

4

1 回答 1

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,无论您的船是否漂浮)。

于 2012-03-06T20:07:16.937 回答