【问题标题】:Do custom template tags cause a database query?自定义模板标签会导致数据库查询吗?
【发布时间】:2019-02-20 03:25:24
【问题描述】:

我正在使用 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 被传递给模板标签函数并使用它的属性而不引起任何额外的 db 查询?

非常感谢模板标签在幕后工作的详细说明!

谢谢。

编辑:请在否决问题前添加理由!

【问题讨论】:

  • 他们为什么会引起数据库查询?如果offer 已经被获取,那么不会。但是,如果offer 包含属性等。延迟加载,它将像任何其他查询一样工作,从而获取相关对象。
  • offer 已获取所有属性。谢谢!

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


【解决方案1】:

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

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

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

prefetch_related()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2012-12-18
    • 2021-07-13
    • 2023-04-01
    相关资源
    最近更新 更多