我的数据库中有一些我这样描述的关系:
@property
def translations(self):
"""
:return: QuerySet
"""
if not hasattr(self, '_translations'):
self._translations = ClientTranslation.objects.filter(base=self)
return self._translations
hasattr() 和 self._translation 背后的想法是让数据库只命中一次,而第二次返回存储的属性。
但是,在阅读文档之后,我不确定代码是否这样做了——因为查询只在真正需要值时才访问数据库——这是在我的代码之后。
正确的方法应该是什么样的?
请您参考如下方法:
是的,DB 在有人第一次需要该值时被命中。但是正如您所指出的,您保存的是查询,而不是结果。用 list(...) 包装查询以保存结果。
顺便说一句,你可以使用cached_property 装饰器让它更优雅。不过,它不是内置的。可以查到here .你最终得到:
@cached_property
def translations(self):
return list(ClientTranslation.objects.filter(base=self))
