在进行查询时我有一些特殊的行为。使用“AND”过滤器后,查询完成后需要大约20-30秒才能呈现到屏幕上。
以下是我用来尝试隔离问题的测试功能。
def reports_question_detail(request, q_id):
question = get_object_or_404(promo_models.Question, pk=q_id)
import time
start_time = time.time()
question_answers = promo_models.QuestionAnswers.objects
.filter(question=q_id, promotion__workflow_status=6)
.values('questionoption').annotate(Count('id'))
print (time.time() - start_time)
return HttpResponse(question_answers)
我尝试过滤掉过滤查询,检查生成的SQL并计算执行的时间。
我原本期望第三个查询需要花费更长的时间,但实际上3个查询中的每个查询都需要几乎完全相同的时间才能运行。但是,在执行完成并且调试打印显示时间之后,在执行查询以呈现到屏幕后,第三个查询再花费20秒左右。
然后我想知道返回的Queryset是否有问题,并尝试通过更改以下行来忽略结果:
的HttpResponse( “完成!”)
...立即在屏幕上呈现所有查询。
最后,我想知道返回的Queryset之间是否存在任何差异,并尝试转储所有属性。前两个查询中的Querysets将其属性快速转储到控制台,但第三个查询结果断断续续,每行约需20-30秒。
我现在已经离开了我的深度。有人可以建议我如何进一步调查吗?
答案 0 :(得分:1)
QuerySets是懒惰的。调用filter
实际上并不对数据库进行任何调用:仅在迭代查询集时才进行调用。因此,您的time
调用仅测量定义查询集对象所需的时间。