Django: USE_TZ = False не обновляет настройки базы данных Postgres

#django #postgresql #django-timezone

#django #postgresql #django-часовой пояс

Вопрос:

Итак, у меня есть некоторая путаница относительно Use_Tz в Django.

При первом запуске проекта для USE_TZ было установлено значение True, а для USE_I18N также было установлено значение True.

Однако на прошлой неделе было решено установить для этих настроек значение False. Согласно приведенным здесь документам, Postgresql должен иметь возможность автоматически переключаться между True и False в зависимости от settings.py файл.

Однако поля даты и времени в моих таблицах показывают отметку часового пояса 01 в конце.

Кроме того, когда я захожу в базу данных напрямую, используя команду d survey_server_app_activitylog , я вижу следующее:

  date_reg       | timestamp with time zone |           
  

Все поля с датой и временем отображают одну и ту же запись. Но я считаю, что они должны быть установлены как timestamp without time zone

Итак, что дает? Я полностью неправильно интерпретирую USE_TZ = False? Нужно ли вручную устанавливать столбцы в базе данных postgres?

Ответ №1:

Смотрите раздел документации по часовому поясу, посвященный конкретно PostgreSQL:

Серверная часть PostgreSQL хранит datetimes как timestamp with time zone . На практике это означает, что он преобразует даты из часового пояса соединения в UTC при хранении и из UTC в часовой пояс соединения при извлечении.

Как следствие, если вы используете PostgreSQL, вы можете свободно переключаться между USE_TZ = False и USE_TZ = True . Часовой пояс подключения к базе данных будет установлен на TIME_ZONE или UTC соответственно, так что Django получает правильные даты и времени во всех случаях. Вам не нужно выполнять какие-либо преобразования данных.

Это отвечает на ваш конкретный вопрос о том, почему тип столбца не изменился. Неясно, какую проблему это на самом деле представляет для вас, поэтому сложно дать дополнительные советы. Если вы попытаетесь изменить тип столбца за пределами Django, я бы не ожидал корректного поведения.

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

1. Возможно, я неправильно это интерпретирую. Итак, я прав, говоря, что PostgreSQL всегда, всегда установлен с timestamp with time zone? , но, если это так, то настройка Django USE_TZ False / True не будет иметь абсолютно никакого эффекта, если не указан часовой пояс; другими словами, по умолчанию всегда будет UTC, если USE_TZ = False.

2. @Nathan: Да, так будет всегда timestamp with time zone . Если TIME_ZONE параметр не указан, Django будет использовать значение по умолчанию, America/Chicago а не UTC , как описано здесь .

3. Хорошо, спасибо за вашу помощь. Думаю, мне придется вручную настроить базу данных postgresql так, чтобы она не использовала временную метку.