自定义模板标签会导致数据库查询吗?

时间:2018-09-15 16:46:57

标签: django django-models django-database django-template-filters

我正在使用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传递给模板标记函数,并使用其属性而不会引起任何额外的数据库查询?

非常感谢您对幕后模板标签的工作进行详细说明!

谢谢。

编辑:在对问题投反对票之前,请添加原因!

1 个答案:

答案 0 :(得分:0)

取决于您如何处理模板标记中的数据。

基本上,当您从数据库加载一行或更多行时,您将拥有有关它的所有信息。另一方面,如果您需要访问关系,则将发送另一个查询,您也可以使用 prefetch 方法将该查询合并到第一个查询中。

诸如调用m2m字段之类的调用可能导致对数据库的新查询,但是如果需要主要属性,则将传递模板上的相同对象,并且无需额外查询即可获得相同数据。

prefetch_related()