@mr_forlife

Как реализовать поиск (фильтрацию) с множеством параметров в Django?

В модели есть несколько полей. Как можно реализовать поиск (фильтрацию) данных на сайте с произвольным набором фильтров? Например, в модели есть поля: поле_1, поле_2, поле_3. Пользователь, используя поисковую форму на сайте, заполняет поле_1 и поле_3, а поле_2 остается не заполненным. Каждое поле формы соответствует одному полю в модели. Т.к. одно из полей не заполнено, то использовать конструкцию model.objects.filter(filter_1, filter_2, filter_3)
не получается.
Каждый фильтр должен дополнять остальные, т.е. работать по принципу AND, но правильно обрабатывать не заполненные поля.
Ввиду неопытности, в голову приходит вариант использования if...else, но такой подход считаю не рациональным, т.к. с каждым добавленным полем код будет очень разрастаться и вероятность ошибок сильно возрастает.
Наверняка в такой сложной и продуманной системе как Django уже что-то придумано для по сути стандартной задачи. Гуглю уже два дня, но ничего толкового найти не могу.
  • Вопрос задан
  • 587 просмотров
Решения вопроса 1
@mr_forlife Автор вопроса
Благодаря наводке Dr. Bacon решил свой вопрос следующим образом:
def get_queryset(self):

        if not self.request.GET:
            return Order.objects.all()  # если нет параметров, просто возвращаем все посты
        filters = Q()  # создаем первый объект Q, что бы складывать с ним другие
        for key in ['order_type', 'technologies']: # в списке названия полей модели для которых осуществляем поиск
            value = self.request.GET.get(key)
            if value:
                filters &= Q(**{f'{key}__icontains': value})
        return Order.objects.filter(filters)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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