#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, ответственном за это, не был включен часовой пояс.