使用Django的包含标签时,如何防止重复的数据库查询?

时间:2019-04-30 06:44:14

标签: django django-templates django-views

因此,想象一下,如果我有这样注册为包含标签的小部件:

my_cons = [3,5,6,7,8,10]

end = len(my_cons)
curr = 0
longest_seq = 0
longests = []

while curr < end:
    tmp_curr = curr;
    while tmp_curr < end-1:
        if my_cons[tmp_curr] +1 == my_cons[tmp_curr+1]:
            tmp_curr += 1
        else:
            break
    if tmp_curr - curr > longest_seq:
        longest_seq = tmp_curr - curr
        longests = [my_cons[curr:tmp_curr+1]]
    elif tmp_curr - curr == longest_seq:
        longests.append(my_cons[curr:tmp_curr+1])
    curr = tmp_curr + 1

print (longests)

在小部件模板中,我遍历了Foo对象中的某些条目。我在Mega菜单和页脚中包含了小部件。这些模板显然是分开的。并包含在@register.inclusion_tag('tags/widget.html', takes_context=True) def widget(context): return {'qs': Foo.objects.all(), 'request': context['request'],}

但是现在,当我加载主页时,我两次针对相同的小部件(“菜单”和“页脚”)访问了数据库,因此我得到了重复的查询。我该如何防止这种情况?

我喜欢包含标记的想法,但我不想重复查询。

1 个答案:

答案 0 :(得分:1)

您可以在base.html中调用标签并保存其返回的数据,然后将其传递给可能需要该数据的其他子模板。

但是我认为您无法再使用inclusion_tag。您可能需要使用类似simple_tag的名称。这是一个示例:

简单标签:

@register.simple_tag
def widget(some_data):
    return Foo.objects.all()

基本模板:

# You can access the result as foo_objs
{% widget some_data as foo_objs %}

# pass the data to other templates:
{% include "menu.html" with foo_objs=foo_objs %}
{% include "footer.html" with foo_objs=foo_objs %}

现在调用一次小部件函数,就可以传递数据了。

Django docs on include