如何在Django中一次性从数据库中检索属性

2 投票
1 回答
727 浏览
提问于 2025-04-17 19:18

我在数据库里有一些关系,描述如下:

@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))

撰写回答