假设我有一个为django编写的基本自定义模板标记。在我的模板中,假设我这样使用它:
getData()
{% do_something "x" %}
{% do_something "y" %}
{% do_something "z" %}
需要从模型中获取信息,即由标记呈现的数据库。假设我每次在模板中添加对do_something
的调用时,django会调用我的数据库吗?
如果是这样,我想找到另一种解决方案,这是我能想到的唯一解决方案:
编写一个“响应后处理器”中间件,它将解析呈现的响应以查找某种占位符,比如do_something
,__x__
等,整理它们,执行单个分组查询,然后用相关内容替换占位符。
这对我来说似乎相当“hacky”,它感觉不对。这是我唯一的选择吗?
答案 0 :(得分:0)
您还可以以某种方式缓存模板标记首次调用时使用的对象,以便下次调用可以重复使用它们。模板标签正在获取上下文变量,您可以在此处添加您的“缓存”标签。对象作为变量。
答案 1 :(得分:0)
首先:请不要做你提出的黑客行为,这似乎非常容易出错和发臭。
无论如何,答案很大程度上取决于do_something
实际做了什么。如果它以某种方式访问模板上下文,你已经存储了模型实例然后没有,如果已经从服务器获取模型,Django不会多次命中数据库 - 来自db的数据被存储在instance.__dict__
。
但是如果do_something
逻辑不能与模板上下文一起使用,而是有自己的逻辑而不是 - 那么它将被调用一次。您可以使用https://pythonhosted.org/django-memoize/之类的缓存工具,但在您的情况下,只有在使用相同参数调用函数时,缓存才适用于该用户案例。事实并非如此 - 你用x,y,z来称呼它......
如果数据库逻辑对于x,y,z调用是相同的,则可以创建访问数据库的缓存函数,而不是从模板标记中调用此函数。