在测试我的Django应用程序时,当使用特定的filter()时,我遇到了特定查询的性能问题。问题解决了,但我不明白为什么。Django filter()增加结果查询集而不是减少
我正在筛选基于3条件的QuerySet。当将它们全部包括在内时,我可以得到预期的结果数量。将其中一个子句移动到其自己的filter()调用时,生成的QuerySet比它应该大得多,并且看起来是重复的条目。
请参阅下面的插图。将result__is_false=False
子句移动到其自己的filter()会导致生成的QuerySet的巨大扩展。
>>> Finding.objects.filter(project=1, result__scan_session__is_enabled=True,\
result__is_false=False).count()
3566
>>> Finding.objects.filter(project=1, result__scan_session__is_enabled=True)\
.filter(result__is_false=False).count()
10050380
问题是我需要有条件地应用有问题的过滤器,而不是每次。我被过滤器()函数转换为排除()例程这样解决了这个问题:
>>> Finding.objects.filter(project=1, result__scan_session__is_enabled=True)\
.exclude(result__is_false=True).count()
3566
这似乎做的伎俩!
虽然我很高兴,这工作,我不明白两两件事:
1)为什么职位说明过滤器()和exclude()似乎表明,它们可以作为平等的,但相反的对待,根据上面的例子,情况并非总是如此。
2)为什么将result__is_false=False
子句移到自己的filter()中会导致结果的巨大跳跃。
有没有人有任何洞察到这些?
用'print(Finding.objects.filter(...)。query)打印查询'并且全部将被回答 – wim
第二部分(解释问题所在)应该作为答案发布。 – EJoshuaS