我正在使用5-6个自定义模板标签。
其中每个类似于以下内容:
@register.filter(name = 'time_left')
def time_left(obj):
if not obj:
return -1
if not obj.has_offer_expired():
return obj.time_left()
return None
我的models.py
中有这个:
def has_offer_expired(self):
return self.end_time <= timezone.now()
def time_left(self):
return int((self.end_time - timezone.now()).total_seconds())
无论何时使用模板标记{{ offer | time_left }}
,都会引起数据库查询吗?还是将offer
传递给模板标记函数,并使用其属性而不会引起任何额外的数据库查询?
非常感谢您对幕后模板标签的工作进行详细说明!
谢谢。
编辑:在对问题投反对票之前,请添加原因!
答案 0 :(得分:0)
取决于您如何处理模板标记中的数据。
基本上,当您从数据库加载一行或更多行时,您将拥有有关它的所有信息。另一方面,如果您需要访问关系,则将发送另一个查询,您也可以使用 prefetch 方法将该查询合并到第一个查询中。
诸如调用m2m字段之类的调用可能导致对数据库的新查询,但是如果需要主要属性,则将传递模板上的相同对象,并且无需额外查询即可获得相同数据。