在模板和视图中使用查询结果

Using the results from a query in BOTH the templates and the view

在 Django 中,我需要查询一个 table 以从数据库中获取一些详细信息。我需要视图和所有模板中的结果。

有没有办法只运行这个查询一次?

如果我不使用上下文处理器,这是我当前的设置:

views.py:

def collect_important_information():
    return SomeModel.objects.filter(parameter=abc)

def homepage(request):
    information = collect_important_information()
    if information:
        do something
    context = {"information": information}
    return render(request, "index.html", context)

def second_page(request):
    information = collect_important_information()
    if information:
        do something else
    context = {"information": information}
    return render(request, "second.html", context)

def third_page(request):
    information = collect_important_information()
    if not information:
        do something
    context = {"information": information}
    return render(request, "third.html", context)

def fourth_page(request):
    information = collect_important_information()
    context = {"information": information}
    return render(request, "third.html", context)

这里有很多重复。我可以通过使用 custom context_processor 将“信息”变量插入每个模板来减少它。像这样:

custom_context_processor.py:

def site(request):
    return { "information": SomeModel.objects.filter(parameter=abc) }

这让我可以将我的 views.py 缩减为:

def collect_important_information():
    return SomeModel.objects.filter(parameter=abc)

def homepage(request):
    information = collect_important_information()
    if information:
        do something
    return render(request, "index.html")

def second_page(request):
    information = collect_important_information()
    if information:
        do something else
    return render(request, "second.html")

def third_page(request):
    information = collect_important_information()
    if not information:
        do something
    return render(request, "third.html")

def fourth_page(request):
    return render(request, "fourth.html")

我的观点更加清晰。但是,如果我这样做,我必须 运行 数据库查询 两次 来处理其中的许多请求。一次是在我的 views.py 函数中获取我需要的数据库变量(对于发生的某些条件,独立于模板),第二次是在上下文处理器文件中。

有没有办法以某种方式 'centralize' 查询并使其仅 运行 一次,并且仍将其插入模板文件并使其在视图函数中可用?

Is there a way to somehow 'centralize' the query and have it run only once, and still inserting it into the template file AND having it available within the function of the view?

QuerySetlazy构造查询集会不会进行数据库请求,你对数据库进行查询如果您 使用 查询集,例如通过对其进行枚举,对其调用 str(…)repr(…)len(…),请使用 [= 检查其真实性14=] 或在 if/elif 子句中。

如果您因此使用将过滤后的查询集传递给模板的上下文处理器,并且您没有以上述方式使用查询集,则不会进行查询.此外,如果将数据传递给上下文,它将覆盖上下文处理器中的数据。因此,如果您已经在视图中对其进行了评估,则可以将其添加到上下文中,以防止进行第二次数据库查询,因此您可以在上下文中覆盖它,这样就没有对“其他”查询集的引用,结果是重复使用。

您需要注意,如果对查询进行了评估,则不要构造新的查询。例如,如果 qs 是一个评估的查询集,您应该再次使用 qs,如果您使用 qs.all(),这将生成一个新的 QuerySet,然后将查询到数据库。