Django中属性装饰器的急加载与急加载一般用法
在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 搜索一下:
8
这是一个术语问题。Django的文档和源码并没有像SQLAlchemy那样使用“急切加载”这个说法。相反,Django使用的是select_related()
和prefetch_related()
这两个查询过滤器,这些在QuerySet的API参考中有说明。
不过,这些是你在查询时添加的,而不是一个声明性的属性。所以当你在查询Player
时,可以使用prefetch_related('roles')
。