或Q查询与Q对象挂起

时间:2012-03-06 18:03:21

标签: django django-q

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

1 个答案:

答案 0 :(得分:1)

根据您的情况,我将假设以下内容:

  1. 你有一个非常大的数据集
  2. 您不想获取太多条目
  3. 要优化代码,最好使用两个查询:

    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,无论你的船是什么漂浮)。