Django在自定义上下文处理器中缓存

时间:2012-05-15 15:39:37

标签: django caching

我有一个自定义上下文处理器,用于在网站范围内生成动态菜单和当前应用列表:

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装饰器,但我可以看到我的页面仍在访问菜单项对象的数据库。

任何帮助都非常感激。

2 个答案:

答案 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), 

这样它就不会被编译/缓存并且动态地工作。