Django DateTime Field для создания полей временной метки без часового пояса
-
18-09-2019 - |
Вопрос
Я работаю над приложением Django, где мне нужно, чтобы все Postgres представляли DateTime полей, которые были сохранены в UTC (как и должны). Когда я создаю модели с полями DateTime, они представления базы данных генерируются как »временная метка с часовым поясом«Хотя я могу вручную изменить таблицы, чтобы удалить часовой пояс с полей, мне было интересно, имеет ли поле модели DateTime возможность не делать этого - т.е., создать»временная метка с часовым поясом«Для некоторых полей. Это возможно? Или мне нужно изменить их столы? Спасибо, Харел
Решение
Типы данных для Postgres в Django Map в строковой литерал timestamp with time zone
, и, похоже, нет возможности изменить этот тип.
Насколько мне известно, у вас есть три варианта:
Воспользуйтесь крюком Джанго для выполнения RAW SQL после оператора CREATE TABLE. Анкет Для этого создать каталог под названием
sql
В вашем приложении и файле в этом каталоге называетсяmymodel.postgres_psycopg2.sql
. Анкет Поместите там свои операторы альтер -таблицы.Напишите пользовательское поле, чтобы определить модификаторы для поля временной метки, как вы считаете нужным. Видеть "Написание пользовательских модельных полей".
Оставьте поле Джанго как есть, и выполните преобразование часового пояса в своем приложении, чтобы вы были абсолютно уверены, что проходите правильное время.
Мое личное предпочтение целостности данных - № 3. Как и в случае с кодировками персонажей, где вы всегда хотите быть уверенным, что знаете Charset и правильно обрабатываете преобразования, я чувствую себя гораздо более комфортно с датами/временами, чьи атрибуты (включая TZ) настолько точно определены, насколько это возможно. Сегодня вы можете быть уверены, что весь ваш ввод отправляется в ваше приложение уже в UTC, но это может измениться, в частности, если временные метки поставляются конечными пользователями. Что бы это ни стоило, я бы прошел лишнюю милю, преобразовывал временную метку в приложении в UTC и храню ее в БД с UTC в качестве часового пояса.