Django: Как организовать выборку по данным из формы?

Есть форма, через которую отправляется GET-запрос.
Нужно по полученным параметрам сделать выборку из базы.
list_of_drives = Drive.objects.filter(manufacturer=request.GET.get('manufacturer', ''),
                                      kind=request.GET.get('kind', ''),
                                      size__gte=int(request.GET.get('min_mem', 0)),
                                      size__lte=int(request.GET.get('max_mem', 0)),
                                      interface=request.GET.get('interface', ''),
                                      ff=request.GET.get('ff', ''),
                                      price__gte=int(request.GET.get('min_price', 0)),
                                      price__lte=int(request.GET.get('max_price', 0)))

Такой код сработает только если все поля заполнены. А как лучше провести проверку на пустоту с последующим формированием корректного фильтра?
Возможен ли более разумный и красивый вариант, чем проход по каждому полю в if...else с проверкой и применением фильтрации в каждой ветке?
  • Вопрос задан
  • 256 просмотров
Решения вопроса 1
@deliro
mapping = {
    'manufacturer': ('manufacturer', None),
    'kind': ('kind', None),
    'min_mem': ('size__gte', int),
    'max_mem': ('size_lte', int),
    'interface': ('interface', None),
    'ff': ('ff', None),
    'min_price': ('price__gte', int),
    'max_price': ('price__lte', int)
}
list_of_drives = Drive.objects.all()
for k, v in mapping.items():  # iteritems() если Python2
    if k in request.GET:
        value = request.GET[k]
        if callable(v[1]):
            value = v[1](value)
        list_of_drives = list_of_drives.filter(**{v[0]: value})

Не забудь обернуть в try, потому что в request.GET может прийти всякая ерунда.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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