执行 'AND' 查询时的特殊 QuerySet 行为

Peculiar QuerySet behaviour when doing an 'AND' query

我在进行查询时有一些奇怪的行为。使用 "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 并计算执行时间。

  1. 过滤器(问题=q_id)
  2. 过滤器(promotion__workflow_status=6)
  3. 过滤器(问题=q_id,promotion__workflow_status=6)

我原以为第三个查询会花费更长的时间,但实际上这 3 个查询中的每一个都与 运行 花费的时间几乎完全相同。但是,在执行完成并且调试打印显示时间后,第三个查询在执行后又需要 20 秒左右才能呈现到屏幕上。

然后我想知道返回的 Queryset 是否有问题,并尝试通过更改以下行来忽略结果:

HttpResponse("Finished!")

... 立即呈现到屏幕上的所有查询。

最后,我想知道返回的 Queryset 之间是否有任何差异,并尝试转储所有属性。前两个查询的查询集将它们的属性快速转储到控制台,但第三个查询时断断续续,每行大约需要 20-30 秒。

我现在有点不知所措了。谁能建议我如何进一步调查这个问题?

查询集是惰性的。调用 filter 实际上不会对数据库进行任何调用:这些调用仅在迭代查询集时进行。因此,您的 time 调用仅测量定义查询集对象所花费的时间。