如何在Django中一次性从数据库中检索属性
我在数据库里有一些关系,描述如下:
@property
def translations(self):
"""
:return: QuerySet
"""
if not hasattr(self, '_translations'):
self._translations = ClientTranslation.objects.filter(base=self)
return self._translations
这里提到的 hasattr()
和 self._translation
的意思是希望数据库只查询一次,第二次就直接返回存储的属性。
不过,在看完文档后,我不太确定这段代码是否真的这样做,因为查询数据库只在真正需要这些值的时候才会发生,而这个时机是在我的代码之后。
那么,正确的做法应该是什么样的呢?
1 个回答
3
没错,第一次有人需要这个值的时候,数据库会被访问。但是正如你所说的,你保存的是查询,而不是查询的结果。你可以用 list(...)
来包裹这个查询,这样就能保存结果了。
顺便提一下,你可以使用 cached_property
这个装饰器来让代码看起来更优雅。不过它不是内置的,你可以在 这里 找到它。最后你会得到:
@cached_property
def translations(self):
return list(ClientTranslation.objects.filter(base=self))