我有一个页面扩展名,可以为页面应用颜色。这是通过模板标签访问的,模板标签检查每个页面的属性,此时这只是运行Page.objects.filter()
调用,显然是在锤击数据库,因为这是为菜单中的每个nav_node调用的。
Page
模型是否有缓存我可以运行reverse_id
过滤器?我的扩展程序对象被缓存了,但是当我尝试将此过滤器应用于菜单项时,我需要尝试确定nav_node
是否为Page
,如下所示,所以我必须直接查看对象(或者它首先调用缓存吗?)。
@register.filter(name='colour')
def colour(nav_node):
"""
Filter receives a CMS menu NavigationNode. We cannot assume this is a Page.
:param nav_node: a node from the cms menu
:type nav_node: menus.base.NavigationNode
:return: colour associated with the Node or None
:rtype: str
"""
pages = Page.objects.filter(reverse_id=nav_node.attr['reverse_id'])[0:2]
page = next((x for x in pages if hasattr(x, 'pagecolourextension')), None)
if page is None:
colour = ''
else:
colour = page.pagecolourextension.page_colour
return colour
我无法在导致页面缓存的Page
模型上看到任何内容,但在管理器上有大量调用使页面缓存无效。如何在缓存页面上运行过滤器?
答案 0 :(得分:0)
我决定最好的解决方法是为CMS页面创建自己的缓存密钥,我可以使用它来访问我的页面扩展,所以我已经移动了查询数据库的逻辑;
pages = Page.objects.filter(reverse_id=nav_node.attr['reverse_id'])[0:2]
page = next((x for x in pages if hasattr(x, 'pagecolourextension')), None)
将它放入if cache.get(key):
类型函数中,以便通过我的缓存方法访问可以访问reverse_id
的页面。这很棒,因为它应该使我能够缓存页面,然后我的任何页面扩展都会调用缓存并根据更改的字段同等地触发信号。