【问题标题】:How to retrieve properties only once from database in django如何从 django 的数据库中仅检索一次属性
【发布时间】:2013-03-16 08:24:47
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python django django-queryset memoization


    【解决方案1】:

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

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

    @cached_property
    def translations(self):
        return list(ClientTranslation.objects.filter(base=self))
    

    【讨论】:

    • 是的,这就是我想要的,但我只保存查询,而不是结果,对吧? (我会使用那个装饰器,但想知道)。
    • 顺便说一句:我明白了,django 附带电池:from django.utils.functional import cached_property 也一样。
    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2021-12-28
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多