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的负载是如何的。我找不到任何关于它的好文档。
由于
答案 0 :(得分:7)
这是一个术语问题。 Django docs / source不像SQLAlchemy那样引用“急切”加载。相反,Django对查询有select_related()
和prefetch_related()
个过滤器,这些过滤器在QuerySet API参考中有记录。
但这是您添加到查询中的内容,而不是声明属性。因此,在查询prefetch_related('roles')
时,您会使用Player
。
答案 1 :(得分:1)
我不确定这是否符合您的需求,因为当您想要多次使用实例的属性时这很有用,但是Django有一个@cached_property装饰器,它将缓存您的属性的结果很长时间因为你的实例存在。
如果您在此处执行快速ctrl + f,请提供更多信息: