属性装饰器急切加载和一般使用 Django 的急切加载
Posted
技术标签:
【中文标题】属性装饰器急切加载和一般使用 Django 的急切加载【英文标题】:property decorator eager load and eager load in general using Django 【发布时间】:2014-09-27 09:35:47 【问题描述】:在 Django 中是否可以对属性装饰器使用预加载?
我的代码作为示例
class Player(models.Model):
roles = models.ManyToManyField(Role, related_name='players')
@property
def role(self):
return ", ".join([r.name for r in self.roles.all().order_by('name')])
使用属性输出玩家角色时,每次都会运行一次查询。
实际上,我仍然不知道在 Django 中,热切负载通常是如何工作的。我找不到任何关于它的好文档。
谢谢
【问题讨论】:
do properties work on django model fields? 的可能重复项 它与预加载无关 【参考方案1】:这是一个术语问题。 Django docs/source 不像 SQLAlchemy 那样引用“渴望”加载。相反,Django 有 select_related()
和 prefetch_related()
用于查询的过滤器,这些过滤器记录在 QuerySet API 参考中。
但这是您添加到查询中的内容,而不是声明性属性。所以你在查询Player
时会使用prefetch_related('roles')
。
【讨论】:
如果我需要在联接表上预加载字段怎么办?【参考方案2】:我不确定这是否符合您的需求,因为当您想多次使用实例的属性时,这很有用,但 Django 有一个 @cached_property 装饰器,它将缓存您的属性结果因为您的实例存在。
如果您在此处快速按 ctrl+f 可获取更多信息:
https://docs.djangoproject.com/en/dev/ref/utils/
【讨论】:
以上是关于属性装饰器急切加载和一般使用 Django 的急切加载的主要内容,如果未能解决你的问题,请参考以下文章