dancha
@dancha
Обожаю python

Как предварительно составить filter django?

У меня большая бд, в конкретно нужной мне таблице 15млн. записей.
Мне нужно сделать фильтр по условиям.
Вот, допустим, моя функция:

spoiler
def addorgtofileinviews(filters):
    if filters['country'] == "all":
        orgs = Organization.objects.select_related()
    else:
        orgs = Organization.objects.filter(country__in=filters['country'])
    if filters['region'] != "all":
        orgs = orgs.filter(region__in=filters['region'])  # почему то queryset создается здесь.
    if filters['city'] != "all":
        orgs = orgs.filter(city__in=filters['city'])
    if filters['raion'] != "all":
        orgs = orgs.filter(raion__in=filters['raion'])
    print(orgs.count())  # Яко бы только сейчас должен создаваться queryset

Из документации написано что queryset "ленивые" и не создаются "пока вы не сделаете что-то для оценки набора запросов." То есть как бы в моем случае это "print". Но почему то это не так.
И вот два вопроса к знатокам:
1. Почему так происходит и как можно исправить?
2. Есть ли возможность как то не повторять "filter'ы" написанные мной в условиях "if", а просто как то собрать один "filter"?
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
@bacon
Но почему то это не так.
как ты это понял?

как то не повторять
for name, value in filters.items():
    if value != 'all':
        orgs = orgs.filter(**{f'{name}__in': value})
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@mkone112
Начинающий питонист.
Собирай фильтры в словарь или Q, в конце передавай в filter, но запрос в бд и так один
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы