Django: фильтровать объекты по диапазону из двух целых - PullRequest
1 голос
/ 12 мая 2019

У меня есть форма поиска с id, price_from, price_to и drive_from, driven_too, но так как цена и ведомость - это одна и та же логика, я фокусируюсь только на одном из них, так как price_from и price_to не в модели, это дает мне ошибка, поскольку этот параметр не существует, поэтому он не может ничего сравнивать.

Как я могу искать в объектах автомобиля объект, цена которого находится в этом диапазоне (price_from - price_to), должен ли я изменить свою модель?

# model
class Car(models.Model):
    id = models.CharField(max_length=255)
    number = models.CharField(max_length=255)
    price = models.IntegerField()

# view
def search(request):
        if 'search_filter' in request.GET:
            search_params = request.GET.dict()
            search_params.pop("search_filter")
            price_from = search_params['price_from']
            price_to = search_params['price_to']
            q_list = [Q(("{}__icontains".format(param), search_params[param])) for param in search_params 
            if search_params[param] is not None]  

            my_query = Car.objects.filter(reduce(operator.and_, q_list))
            cars = [{
                'id': x.id,
                'driven': x.driven,
                'price': x.price,
            } for x in my_query
            ]
            return JsonResponse({'data': cars})
        context = {'cars': Car.objects.all().order_by('price')}
        return render(request, 'cars/car_index.html', context)

1 Ответ

1 голос
/ 12 мая 2019

Вы можете создать объект Q(..) с помощью:

Q(price__gte=price_from, price__lte=price_to)

или исключить границы с:

Q(price__gt=price_from, price__lt=price_to)

, хотя возможно, чтоprice_from или price_to равен None, и, таким образом, создается объект Q с kwargs:

if 'search_filter' in request.GET:
    search_params = request.GET.dict()
    search_params.pop('search_filter')
    <b>price_from = search_params.pop('price_from', None)</b>
    <b>price_to = search_params.pop('price_to', None)</b>
    q_list = [
        Q(('{}__icontains'.format(k), v))
        for k, v in search_params.items()
        if v is not None
    ]
    <b>price = { 'price__gte': price_from, 'price__lte': price_to }</b>
    q_list.append(<b>Q(**{k: int(v) for k, v in price.items() if v is not None}</b>))
    # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...