执行“AND”查询时的特殊QuerySet行为

时间:2015-05-09 20:26:02

标签: django django-queryset

在进行查询时我有一些特殊的行为。使用“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. 过滤器(question = q_id,promotion__workflow_status = 6)
  4. 我原本期望第三个查询需要花费更长的时间,但实际上3个查询中的每个查询都需要几乎完全相同的时间才能运行。但是,在执行完成并且调试打印显示时间之后,在执行查询以呈现到屏幕后,第三个查询再花费20秒左右。

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

      

    的HttpResponse( “完成!”)

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

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

    我现在已经离开了我的深度。有人可以建议我如何进一步调查吗?

1 个答案:

答案 0 :(得分:1)

QuerySets是懒惰的。调用filter实际上并不对数据库进行任何调用:仅在迭代查询集时才进行调用。因此,您的time调用仅测量定义查询集对象所需的时间。