Фильтр Django Диапазон дат Выпуск ORM - PullRequest
0 голосов
/ 11 февраля 2019

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

Вот важная часть моего кода:

start = datetime.now().replace(tzinfo=pytz.UTC) - timedelta(days=15)
end = datetime.now().replace(tzinfo=pytz.UTC)
# 2019-01-27 10:26:16.235354+00:00 | 2019-02-11 10:26:16.235354+00:00
print(start, '|', end)

completed_work_orders = WorkOrders.objects.using(db_alias).filter(
    unit_id=int(resident.unit_id),
    resident_dismissed=1).filter(date_created__range=[start, end]).order_by('-date_created')

Что дает мне: completed: <QuerySet [<WorkOrders: WorkOrders object (7)>]>

Здесь я выбираю только 1 строку, когда следует выбрать 3, вот мои date_created значения для строк 7, 8 и 9, выбирается только строка 7:

7) Выбрано 2019-02-07 12: 07: 59.72546-08

8) Не выбрано 2019-02-11 08:58: 27.561245-08

9) Не выбрано 2019-02-11 09: 03: 35.063078-08

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

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

В Django вы всегда должны использовать django.utils.timezone.now () вместо datetime.now().Таким образом, вы гарантируете, что получите даты, которые соответствуют часовому поясу вашего проекта, которые затем должны соответствовать датам, хранящимся в базе данных.

Дополнительная информация: https://docs.djangoproject.com/en/2.1/topics/i18n/timezones/#naive-and-aware-datetime-objects

0 голосов
/ 11 февраля 2019

Дата окончания указана в часовом поясе UTC, но записи в вашей БД локализованы в часовом поясе вашего сервера.В зависимости от часового пояса вашего сервера конечная дата 2019-02-11 10:26:16.235354+00:00 будет фактически отличаться, например, для Нью-Йорка это будет 2019-02-11 05:26:16.235354+00:00.

Снимите .replace(tzinfo=pytz.UTC) с даты начала и окончания, и все будет хорошо.

...