Queryset-подобная фильтрация коллекции объектов в Django

Я ищу способ легко отфильтровать коллекцию объектов Model, не обращаясь к базе данных каждый раз. По определению, QuerySets ленивы и всегда будут попадать в БД. Поэтому мне интересно, существует ли что-нибудь, что может сделать это. Если нет, возможно, это хорошая библиотека для создания.

Например:

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, которая решит эту проблему? Заранее спасибо!

3 ответа

Решение

Я думаю, что метод QuerySet select_related это то, что вы хотите:

https://docs.djangoproject.com/en/dev/ref/models/querysets/

Пожалуйста, посмотрите файл manager.py в следующем проекте: django-model-utils /.../ Manager.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

Если ваши мотивы для этого вопроса - длинные наборы данных, используйте кэш Redis в вашем проекте Django.

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

Другие вопросы по тегам