Django. Как сделать фильтрацию по параметрам, если они могут быть пустые?
Мой проект подключен к базе данных с городами, улицами, и магазинами. Моя задача обработать следующий запрос:
(GET-запрос)
/shop/?street=&city=&open=— получение списка магазинов;
Метод принимает параметры для фильтрации. Параметры не обязательны. В случае отсутствия параметров выводятся все магазины, если хоть один параметр есть , то по нему выполняется фильтрация.
Мой код:
def Shops(request) -> HttpResponse:
street = request.GET.get("street", -1)
city = request.GET.get("city", -1)
open = request.GET.get("open", -1)
if open == "1":
shops = Shop.objects.filter(shop_city_id=city, shop_street_id=street,
shop_time_to_open__lte=timezone.now(),
shop_time_to_close__gte=timezone.now())
elif open == "0":
shops = Shop.objects.filter(shop_city_id=city, shop_street_id=street,
shop_time_to_open__gt=timezone.now(),
shop_time_to_close__gt=timezone.now())
return render(request, "getshops.html", {"shops": shops}, status=200)
Укажите пожалуйста, каким образом я могу решить свою задачу?
Ответы (1 шт):
Я уже давно не пишу на Django, но сделал бы что-то вроде этого (далее по тексту может быть не корректный код в применении к Django; расценивайте его скорее как псевдокод для передачи смысла идеи):
def Shops(request) -> HttpResponse:
street = request.GET.get("street", -1)
city = request.GET.get("city", -1)
open_par = request.GET.get("open", -1)
if city != -1:
query = Shop.objects.filter(shop_city_id=street)
else:
query = Shop.objects.all()
if street != -1:
query = query.filter(shop_street_id=street)
if open_par != -1:
if open == "1":
shops = query.filter(shop_time_to_open__lte=timezone.now(),
shop_time_to_close__gte=timezone.now())
elif open == "0":
shops = query.filter(shop_time_to_open__gt=timezone.now(),
shop_time_to_close__gt=timezone.now())
else:
shops = query.all()
return render(request, "getshops.html", {"shops": shops}, status=200)