фильтр даты django gte и lte

Мне нужно найти данные в рамках определенного набора параметров. Я создаю небольшую систему бронирования, которая позволяет пользователю видеть, какие транспортные средства доступны для бронирования для их небольшого путешествия на сафари.

В системе есть бронирования, которые были ранее введены или сделаны клиентом.

Если бронирование pickup_date = 2011-03-01 и dropoff_date = 2011-03-15 и я запускаю запрос с pickup=2011-03-09 и dropoff=2011-03-14 в своих представлениях, как показано ниже, он не возвращает никаких результатов, чтобы узнать, было ли бронирование в этот период времени.

views.py

def dates(request, template_name='groups/_dates.html'):
    pickup=request.GET.get('pickup','None');
    dropoff=request.GET.get('dropoff','None');
    order = Order.objects.filter(pick_up__lte=pickup).filter(drop_off__gte=dropoff)

    context = {'order':order,}

    return render_to_response(template_name,context,
        context_instance=RequestContext(request))

Любые предложения о том, как это сделать? Или мне следует искать альтернативный способ выполнения этого запроса?


person ApPeL    schedule 09.03.2011    source источник
comment
Вы хотите вернуть заказы между посадкой и высадкой? если да, то не должен ли он быть Order.objects.filter(pick_up__gte=pickup, drop_off__lte=dropoff), например любые заказы между или равными 09.03.2011 и 14.03.2011? Или я неправильно понял требование?   -  person JamesO    schedule 09.03.2011
comment
Хорошо, если я, клиент, хочу забронировать автомобиль, и мои даты 2011-03-09, как пикап, и 2011-03-14, как возврат, и другое бронирование уже находится в системе с датой 2011 г. -03-01, как посадка, и 2011-03-15, как высадка, я хочу, чтобы система сообщила мне, что этот временной интервал занят. Теперь имеет больше смысла?   -  person ApPeL    schedule 09.03.2011
comment
Я всегда рекомендую использовать форму для очистки ввода.   -  person Wim Feijen    schedule 04.03.2017


Ответы (2)


Возможно ли, что поскольку вы передаете необработанную строку в набор запросов в неправильном формате, попробуйте преобразовать строки в объекты даты и времени.

Позже вы можете попробовать использовать поиск по диапазону, который более эффективен для некоторых механизмов БД и более прост для чтения и кодирования.

from django.db.models import Q

start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
orders = Order.objects.filter(drop_off__gte=start_date, pick_up__lte=end_date)
# Or maybe better
orders = Order.objects.filter(Q(drop_off__gte=start_date), Q(pick_up__lte=end_date))
person Mario César    schedule 09.03.2011

Можете ли вы попробовать это:

order = Order.objects.filter(pick_up**__date__**lte=pickup).filter(drop_off**__date__**gte=dropoff)

https://docs.djangoproject.com/fr/2.0/ref/models/querysets/#date

person Michel MARTIN    schedule 27.03.2018
comment
Лучше включать информацию непосредственно в ответ, а также в ссылку, чтобы ответ по-прежнему был полезен, если ссылка исчезнет. - person Nick; 27.03.2018
comment
@Ник, если ссылка исчезнет, ​​это, вероятно, потому, что она больше не поддерживается. Я не думаю, что это проблема в данном случае. - person Olaf Szmidt; 13.12.2018