Почему для извлеченных моделей Django не установлен часовой пояс на дату и время?

#django #timezone

#django #Часовой пояс

Вопрос:

У меня есть вопрос о том, как Django работает с часовыми поясами.

В своих настройках я настраиваю свой часовой пояс:

 USE_TZ = True
TIME_ZONE = 'Europe/Amsterdam'  # At time of writing UTC 2
  

У меня есть модель с полем DateTimeField. Я знаю, что всякий раз, когда Django сохраняет эту модель в часовом поясе UTC, независимо от настроек часового пояса. Я также знаю, что всякий раз, когда Django встречает дату и время без часового пояса (наивное время даты), он принимает его в часовом поясе по умолчанию (в моем случае в Амстердаме) и преобразует его в UTC при сохранении. См . https://docs.djangoproject.com/en/3.1/topics/i18n/timezones/#interpretation-of-naive-datetime-objects

Однако всякий раз, когда я извлекаю модель из базы данных с помощью Django, поле DateTimeField будет иметь datetime, у которого нет часового пояса. По спецификации я знаю, что он находится в UTC, но всякий раз, когда я сохраняю свою модель обратно в БД (после обновления некоторых полей) Django увидит, что дата-время наивно, и предположит, что оно находится в часовом поясе по умолчанию. В моем случае он продолжает вычитать 2 часа из даты и времени каждый раз, когда обновляется объект.

Итак, всякий раз, когда я делаю это.

 A = MyModel.object.get(pk=1)
A.some_field = 10
A.save()
  

Я получу a RuntimeWarning: DateTimeField received a naive datetime , и моя временная метка будет вычтена на 2 часа.

Я могу решить это с помощью

 A = MyModel.object.get(pk=1)
A.date_time_field = A.date_time_field.replace(tzinfo=django.utils.timezone.utc)
A.some_field = 10
A.save()
  

Но, похоже, это не тот путь?

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

1. Это не стандартное поведение Django, поэтому что-то в вашей настройке нарушено. Вы должны изучить (и добавить сведения о) свою базу данных и адаптер базы данных. И вы можете посмотреть, сможете ли вы повторить это с помощью нового проекта Django в той же системе.

2. @KevinChristopherHenry Спасибо, я обнаружил, что в поле postgresql не был включен часовой пояс.

Ответ №1:

В поле Postgresql, ответственном за это, не был включен часовой пояс.