Как использовать Django __time lookup в наборе запросов - PullRequest
0 голосов
/ 23 мая 2018

У меня есть модель с 2 полями даты и времени, которая выглядит следующим образом:

class Booking(models.Model):
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    ...

В качестве тестовых данных у меня есть 2 бронирования с start_date до 17:30 и 2 бронирования после 17:45, все на одномдень (8 мая 2018 года).Я пытаюсь отфильтровать заказы с помощью поиска __time, чтобы найти все заказы до (и в том числе) 17:30.Мой набор запросов:

bookings = Booking.objects.filter(date__time__lte=datetime.time())

Где datetime.time печатается как

datetime.time(17, 30)

и где часть даты даты и времени совпадает с датами бронирования.Приведенный выше запрос возвращает пустой набор запросов, но если я использую тот же запрос, за исключением фильтрации для времен, превышающих datetime.time (), т.е.

bookings = Booking.objects.filter(date__time__gte=datetime.time())

Набор запросов возвращает все заказы (где он должен возвращать только 2заказы с start_date после 17:30).Может кто-нибудь объяснить мне, как предполагается использовать поиск __time?

РЕДАКТИРОВАТЬ Я обновил фильтр до

bookings = Booking.objects.filter(start_date__time__lte=datetime.time())

, и результат тот же.Когда я печатаю значения бронирований, это:

print Booking.objects.all().values('date', 'end_date')
[
    {'start_date': datetime.datetime(2018, 5, 8, 16, 30, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>), 'end_date': datetime.datetime(2018, 5, 8, 17, 0, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>)},
    {'start_date': datetime.datetime(2018, 5, 8, 17, 0, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>), 'end_date': datetime.datetime(2018, 5, 8, 17, 30, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>)}, 
    {'start_date': datetime.datetime(2018, 5, 8, 17, 45, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>), 'end_date': datetime.datetime(2018, 5, 8, 18, 15, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>)}, 
    {'start_date': datetime.datetime(2018, 5, 8, 17, 45, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>), 'end_date': datetime.datetime(2018, 5, 8, 18, 15, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>)}
]

РЕДАКТИРОВАТЬ 2 Я забыл упомянуть, что мне нужно получить заказы на ту же дату.Как предложил siddhant0905, вместо этого я отфильтровал набор запросов с указанием даты и времени и добавил дополнительный фильтр, чтобы убедиться, что он был в ту же дату.У меня сработало следующее:

bookings = Booking.objects.filter(Q(start_date__date=datetime.date()) & Q(start_date__lte=datetime))

1 Ответ

0 голосов
/ 23 мая 2018

Я думаю, вы должны сравнить весь объект datetime, а не просто сравнивать временную часть.Отладьте «Тип» времени, когда возвращается запрос, и тип времени, с которым вы его сравниваете.Оба должны быть одинаковыми.Оболочка Джанго может оказать большую помощь.

...