2

我的数据库中有一些我这样描述的关系:

@property
def translations(self):
    """
    :return: QuerySet
    """
    if not hasattr(self, '_translations'):
        self._translations = ClientTranslation.objects.filter(base=self)
    return self._translations

hasattr()and背后的想法self._translation是让数据库只命中一次,而第二次返回存储的属性。

但是,在阅读完文档后,我不确定代码是否正在这样做——因为查询只会在真正需要值时才访问数据库——这在我的代码之后。

正确的方法应该是什么样子?

4

1 回答 1

3

是的,当有人第一次需要该值时,DB 就会被击中。但正如您所指出的,您保存的是查询,而不是结果。包装查询list(...)以保存结果。

顺便说一句,您可以使用cached_property装饰器使其更优雅。不过,它不是内置的。可以在这里找到。你最终得到:

@cached_property
def translations(self):
    return list(ClientTranslation.objects.filter(base=self))
于 2013-03-16T09:13:05.503 回答