【问题标题】:Queryset-like filtering of object collection in DjangoDjango中对象集合的类似查询集的过滤
【发布时间】:2013-03-11 11:29:40
【问题描述】:

我正在寻找一种方法来轻松地从模型对象的集合中进行过滤,而无需每次都访问数据库。根据定义,QuerySet 是惰性的,并且总是会访问数据库。所以我想知道是否有任何东西可以做到这一点。如果没有,也许它是一个很好的创建库。

例如:

all_records = object_set(Record.objects.filter(company=user.company))

object_set 是一个假设函数,它将 QuerySet 中的所有对象收集为静态数据。结果将是一个“对象管理器”实例,它可以运行过滤器,类似于 QuerySet 过滤器。这在基于多维数据列表中的数据存储创建、更新和删除对象时特别有用。

for row in data:
  for col in row:
    # this would not hit the DB. Only filter within the "object_set" in memory.
    all_records.filter(date=col.date, type=col.type, creator=col.user)

我意识到我可能试图以错误的方式解决这个问题,但无论如何,我认为这将是 Django 中的一个很好的工具。有谁知道 Django 中现有的库或功能可以解决这个问题?提前致谢!

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    我认为QuerySet的select_related方法是你想要的:

    https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

    【讨论】:

    • 几乎,但结果仍然是一个 qs,它会在每个过滤器上命中数据库或被调用。
    【解决方案2】:

    请查看以下项目中的managers.py:django-model-utils/.../managers.py

    它应该告诉你他是如何实现查询集的

    def get_query_set(self):
        qs = super(QueryManager, self).get_query_set().filter(self._q)
        if self._order_by is not None:
            return qs.order_by(*self._order_by)
        return qs
    

    【讨论】:

      【解决方案3】:

      如果长数据集是您回答这个问题的动机,请在您的 Django 项目中使用 Redis 缓存。

      http://unfoldthat.com/2011/09/14/try-redis-instead.html

      【讨论】:

        猜你喜欢
        • 2014-01-08
        • 2022-11-08
        • 2019-12-04
        • 2020-08-22
        • 2019-04-15
        • 2011-09-29
        相关资源
        最近更新 更多