我有一个自定义上下文处理器,用于在网站范围内生成动态菜单和当前应用列表:
from portal.models import *
def base_items(request):
return {
...
'app_items': App.objects.filter(isonline=True),
'menu_items': MainMenu.objects.all().order_by('position'),
}
编辑:
我的模板(请注意,许多这些网址都在Django框架之外,因语言而异。因此需要将它们硬编码到数据库字段中:
<ul class="menu">
{% for item in menu_items %}
{% if LANGUAGE_CODE = "en-us" %}
<li><a title="{{ item.title_en }}" href="{{ item.url_en }}">{{ item.title_en }}</a>
<ul>
{% for subitem in item.submenu_set.all %}
<li><a title="{{ subitem.title_en }}" href="{{ subitem.url_en }}">{{ subitem.title_en }}</a></li>
{% endfor %}
</ul>
</li>
{% else %}
<li><a title="{{ item.title_es }}" href="{{ item.url_es }}">{{ item.title_es }}</a>
<ul>
{% for subitem in item.submenu_set.all %}
<li><a title="{{ subitem.title_es }}" href="{{ subitem.url_es }}">{{ subitem.title_es }}</a></li>
{% endfor %}
</ul>
</li>
{% endif %}
{% endfor %}
</ul>
我的问题是 - 如何缓存这些不经常变化的结果?
我已经尝试了@cache_page装饰器,但我可以看到我的页面仍在访问菜单项对象的数据库。
任何帮助都非常感激。
答案 0 :(得分:3)
您可以使用django low level cache API。请注意,您可能需要cast the querysets to list。
或,您可以cache the template fragment使用这些查询集,因为querysets are lazy。
答案 1 :(得分:0)
尝试将lambdas表达式返回到模板:
'app_items': lambda: App.objects.filter(isonline=True),
这样它就不会被编译/缓存并且动态地工作。