我正在使用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。
答案 0 :(得分:1)
根据您的情况,我将假设以下内容:
要优化代码,最好使用两个查询:
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
,无论你的船是什么漂浮)。