django 查询中 or-ing Q 对象的性能影响

sed*_*idw 5 python sql django django-q

我正在执行一个查询,该查询将一堆 Q 组合在一起,这似乎花费了很多时间。这是一些伪代码

query_params = []
for i in range(80): #there are about 80ish Q objects being created
    query_params.append(Q(filter_stuff))
Run Code Online (Sandbox Code Playgroud)

然后我或他们一起

query_params = reduce(or_, query_params)
Run Code Online (Sandbox Code Playgroud)

当我执行查询时

query = list(MyModel.objects.filter(query_params))
Run Code Online (Sandbox Code Playgroud)

它挂了很长时间。我知道这是一个非常普遍的问题,如果不深入了解数据结构,就很难给出诊断(这里很难给出)。但我只是好奇Qdjango 查询中的 or-ing对象是否存在固有的性能影响

sed*_*idw 4

通过减少对象的数量能够显着缩短查询的长度Q。它们的格式都是这样的:

q1 = Q(field1=field1_val1, field2=field2_val1)
q2 = Q(field1=field1_val2, field2=field2_val2)
#...etc
Run Code Online (Sandbox Code Playgroud)

我最终按 field1 值对它们进行分组:

q_dict = {field1_val1: [all field_2 values paired with field1_val1], ...}
Run Code Online (Sandbox Code Playgroud)

然后我的 q 对象看起来像这样:

for field1_val, field2_vals = q_dict.items():
    query_params.append(Q(field1=field1_val, field2__in=field2_vals))
Run Code Online (Sandbox Code Playgroud)

这最终显着减少了我的Q对象数量,并且查询运行得更快