Python Django如何正确缓存以重用数据?(使用Django mptt包和redis模块)

Python Django如何正确缓存以重用数据?(使用Django mptt包和redis模块),python,django,caching,Python,Django,Caching,我正在制作一种动态菜单。当您单击顶部的菜单时,它会在左侧显示子菜单。我用stackoverflow和google的关键字“动态菜单”搜索。我有了制作这种菜单的想法。我做的像下面这样 1) 通过自定义上下文处理器将上下文中的数据(菜单列表)呈现到模板 2) 使用django mptt包提供的自定义模板标记 3) 在基本模板中显示顶部菜单 4) 移动到另一个模板以根据单击的顶部菜单显示子菜单 我制作了自定义上下文处理器,以便在每个模板的上下文中使用菜单 上下文处理器.py from manager.

我正在制作一种动态菜单。当您单击顶部的菜单时,它会在左侧显示子菜单。我用stackoverflow和google的关键字“动态菜单”搜索。我有了制作这种菜单的想法。我做的像下面这样

1) 通过自定义上下文处理器将上下文中的数据(菜单列表)呈现到模板

2) 使用django mptt包提供的自定义模板标记

3) 在基本模板中显示顶部菜单

4) 移动到另一个模板以根据单击的顶部菜单显示子菜单

我制作了自定义上下文处理器,以便在每个模板的上下文中使用菜单

上下文处理器.py

from manager.models import Menu

def menu(request):
    menu_list = list(Menu.objects.all())
    return {'menu':menu_list}
py(示例)

  • 最后,我不知道是否有很多人在使用django mptt包。我想只有少数人有亲身使用它的经验。它说“只需要一个数据库查询(整个树的子项都被缓存)”那么这是否意味着如果我在模板上使用django mptt包并从中获取菜单,它会自动缓存数据?
  • 嗯,我不清楚django缓存系统


    如果您能为我的问题提供答案和见解,我将不胜感激。谢谢你的阅读

    您可以简单地在数据库中打开日志记录,以便每次发出查询时都将对其进行记录。然后调用您的视图。如果缓存工作,那么对菜单的查询将只发出一次。哦。好提示。非常感谢。您可以简单地在数据库中打开日志记录,以便每次发出查询时都将对其进行记录。然后调用您的视图。如果缓存工作,那么对菜单的查询将只发出一次。哦。好提示。非常感谢。
    {% load mptt_tags %}
    
    <nav id="{{ menu_id }}" class="tree-menu">
        <ul>
            {% recursetree menu %}
                <li class="menu
                    {% if node.is_root_node %}root{% endif %}
                    {% if node.is_child_node %}child{% endif %}
                    {% if node.is_leaf_node %}leaf{% endif %}
    
                    {% if current_menu in node.get_descendants %}open{% else %}closed{% endif %}
                ">
                    <a href="?{{ node.menu_name }}={{ node.pk }}">{{ node.menu_name }}</a>
                    {% if not node.is_leaf_node %}
                        <ul class="children">
                            {{ children }}
                        </ul>
                    {% endif %}
                    {% if node.items and node.items.exists %}
                        <ul class="items">
                            {% for item in node.items.all %}
                                {% if item_template %}
                                    {% include item_template %}
                                {% else %}
                                    {% include "menu/tree-item.html" %}
                                {% endif %}
                            {% endfor %}
                        </ul>
                    {% endif %}
                </li>
            {% endrecursetree %}
        </ul>
    </nav>
    
    @register.tag
    def recursetree(parser, token):
        """
        Iterates over the nodes in the tree, and renders the contained block for each node.
        This tag will recursively render children into the template variable {{ children }}.
        Only one database query is required (children are cached for the whole tree)
    
        Usage:
                <ul>
                    {% recursetree nodes %}
                        <li>
                            {{ node.name }}
                            {% if not node.is_leaf_node %}
                                <ul>
                                    {{ children }}
                                </ul>
                            {% endif %}
                        </li>
                    {% endrecursetree %}
                </ul>
        """
        bits = token.contents.split()
        if len(bits) != 2:
            raise template.TemplateSyntaxError(_('%s tag requires a queryset') % bits[0])
    
        queryset_var = template.Variable(bits[1])
    
        template_nodes = parser.parse(('endrecursetree',))
        parser.delete_first_token()
    
        return RecurseTreeNode(template_nodes, queryset_var)
    
    from manager.models import Menu
    from django.core.cache import cache
    
    def menu(request):
    
        menu_list = cache.get_or_set('menu_list', list(Menu.objects.all()))
    
        return {'menu':menu_list, 'redis':"Food"}