Django中属性装饰器的急加载与急加载一般用法

3 投票
2 回答
1654 浏览
提问于 2025-04-18 15:58

在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 个回答

1

我不太确定这是否符合你的需求,因为这个方法适合在你想多次使用某个实例的属性时。不过,Django 有一个叫 @cached_property 的装饰器,它可以缓存你属性的结果,只要你的实例还存在,这个结果就会被保留。

如果你想了解更多信息,可以在这里快速按下 ctrl+f 搜索一下:

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

8

这是一个术语问题。Django的文档和源码并没有像SQLAlchemy那样使用“急切加载”这个说法。相反,Django使用的是select_related()prefetch_related()这两个查询过滤器,这些在QuerySet的API参考中有说明。

不过,这些是你在查询时添加的,而不是一个声明性的属性。所以当你在查询Player时,可以使用prefetch_related('roles')

撰写回答