我在我的数据库中有一些关系,我这样描述:
@property
def translations(self):
"""
:return: QuerySet
"""
if not hasattr(self, '_translations'):
self._translations = ClientTranslation.objects.filter(base=self)
return self._translations
hasattr()
和self._translation
背后的想法是让数据库只打一次,而第二次返回存储的属性。
然而,在阅读完文档之后,我不确定代码是否正在执行此操作 - 因为查询仅在真正需要值时才会访问数据库 - 这是在我的代码之后。
正确的方法怎么样?
答案 0 :(得分:3)
是的,数据库在第一次有人需要该值时被点击。但正如您所指出的,您保存查询,而不是结果。使用list(...)
换行查询以保存结果。
顺便说一句,您可以使用cached_property
装饰器使其更加优雅。但它不是内置的。它可以找到here。你最终得到:
@cached_property
def translations(self):
return list(ClientTranslation.objects.filter(base=self))