django queryset lazyness和模板上下文

时间:2012-12-05 09:36:46

标签: django django-queryset

假设我有3个模型A BC以及一个像这样的views.py:

def blahblah(request):
    a = A.objects.all(),
    b = B.objects.all(),
    c = C.objects.all(),
    context = {
      a = a,
      b = b,
      c = c,
    }
    return render(request, template, context)

我听说queryset很懒,所以在我们使用之前它不会命中数据库。问题是,如果我的模板仅使用a {{ a }}而不使用bc,那么我们访问数据库的次数是多少?是在上下文中放置一个查询集而不是在模板上使用它来触发查询集?谢谢,抱歉我的英语不好。

1 个答案:

答案 0 :(得分:3)

只有一次。如果您实际上没有从bc检索任何结果,则不会命中数据库。

通常,在模板中,当您使用for循环从查询集中提取单个项目时,或者运行其他方法(如count)时,可能会发生这种情况。但假设您的模板仅显示{{a}},那么实际上只会从数据库中查询a,尽管如果您使用的是all,而不是{{},这有点奇怪。 1}}。

我还应该补充一点,您可以使用debug toolbar来实际查看执行的查询。