属性装饰器急切加载和一般使用 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 的急切加载的主要内容,如果未能解决你的问题,请参考以下文章

我可以同时使用急切和延迟加载吗?

Hibernate:为啥 FetchType.LAZY 注释的集合属性急切地加载?

Laravel 动态关系 - 在急切加载时访问模型属性

Nhibernate:只读属性导致急切加载

实体框架上的急切加载导航属性

laravel eloquent - 在嵌套急切加载的关系上不使用