一般使用Django的属性装饰器渴望加载和急切加载

时间:2014-08-04 20:07:38

标签: python django django-models python-decorators

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的负载是如何的。我找不到任何关于它的好文档。

由于

2 个答案:

答案 0 :(得分:7)

这是一个术语问题。 Django docs / source不像SQLAlchemy那样引用“急切”加载。相反,Django对查询有select_related()prefetch_related()个过滤器,这些过滤器在QuerySet API参考中有记录。

但这是您添加到查询中的内容,而不是声明属性。因此,在查询prefetch_related('roles')时,您会使用Player

答案 1 :(得分:1)

我不确定这是否符合您的需求,因为当您想要多次使用实例的属性时这很有用,但是Django有一个@cached_property装饰器,它将缓存您的属性的结果很长时间因为你的实例存在。

如果您在此处执行快速ctrl + f,请提供更多信息:

https://docs.djangoproject.com/en/dev/ref/utils/