Почему django date filter также выдает мне записи со следующего дня

#python #django #sqlite

#python #django #sqlite

Вопрос:

Я пытаюсь получить доступ к базе данных, в которой есть, скажем, две записи для 2016,9,25 и две записи для 2016,9,26, каждая из этих записей имеет разное время… Я просматриваю их, перечисляя каждую из них с помощью task.start_time в моем шаблоне ниже приведен список, который я получаю

 TASK        Task.title                  duration    start_time                  project     project_color   user
1st task    This is the first task      0:02:40     Sept. 25, 2016, 11:42 p.m.  Unassigned  NO COLOR    faizank
2nd task    This is the second task     0:01:30     Sept. 25, 2016, 11:47 p.m.  Unassigned  NO COLOR    faizank
3rd task    asdasdasdasd                0:20:00     Sept. 26, 2016, 12:19 a.m.  Unassigned  NO COLOR    faizank
3rd task    this is the problem         0:20:00     Sept. 26, 2016, 12:22 a.m.  Unassigned  NO COLOR    faizank
  

start_time — это datetime_field, теперь я фильтрую объект datetime, используя следующие запросы

 >>> c= Task.objects.filter(start_time__date=datetime.date(2016,9,25)
  

Это дает мне

 <QuerySet [<Task: 1st task>, <Task: 2nd task>, <Task: 3rd task>, <Task: 3rd task>]>
  

но когда я меняю дату на 26, это дает мне пустой набор….

Я даже сделал это

 >>> c= Task.objects.filter(start_time__date=datetime.datetime(2016,9,25,0,0,0,0,pytz.UTC)
  

получил тот же результат.

Итак, почему date возвращает записи из 26 …. и при запросе 26 он возвращает пустой набор….

РЕДАКТИРОВАТЬ 1:

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

 >>> d= <QuerySet [<Task: 1st task>, <Task: 2nd task>, <Task: 3rd task>, <Task: 3rd task>]>
>>> d[2].start_time
  

и получил следующее

 datetime.datetime(2016, 9, 25, 19, 19, 59, 477000, tzinfo=<UTC>)
  

что ясно показывает, что 3-я задача хранится в другое время и то, которое она показывает в шаблоне, на самом деле я думаю, что это ровно -5 часов с момента отображения, которое является GMT, поэтому теперь возникает реальный вопрос: почему шаблон показывает разное время для одной и той же модели …. и что более важно, как я могу это исправить…

Комментарии:

1. Установлен ли ваш USE_TZ var на True ?

2. да, это так………

Ответ №1:

Согласно ссылке на набор запросов Django для date :

Когда USE_TZ значение True, поля преобразуются в текущий часовой пояс перед фильтрацией.

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

Комментарии:

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

2. @fazkan Я думаю, что это был бы отличный дополнительный вопрос, как только вы кратко ознакомитесь с документами Django. У меня нет ответа с головы до ног.

Ответ №2:

Я знаю, что это ужасное решение, но оно сработало для меня. Отключите USE_TZ и включите снова после выполнения запроса:

 from django.conf import settings
    settings.USE_TZ = False
    .... [query]
    settings.USE_TZ = True