我正在开发一个Django应用程序,其中需要将所有的postgres日期时间字段保存为UTC时间(这是应该的)。当我创建带有DateTime字段的模型时,它们在数据库中的表示形式生成为“timestamp with time zone”。 虽然我可以手动更改表格以从字段中删除时区,但我想知道DateTime模型字段是否具有不执行此操作的能力 - 即为某些字段创建“timestamp without time zone”。 这是可能的吗?还是我必须更改表格? 谢谢, Harel
我正在开发一个Django应用程序,其中需要将所有的postgres日期时间字段保存为UTC时间(这是应该的)。当我创建带有DateTime字段的模型时,它们在数据库中的表示形式生成为“timestamp with time zone”。 虽然我可以手动更改表格以从字段中删除时区,但我想知道DateTime模型字段是否具有不执行此操作的能力 - 即为某些字段创建“timestamp without time zone”。 这是可能的吗?还是我必须更改表格? 谢谢, Harel
在Django中,Postgres的数据类型映射为字符串字面量timestamp with time zone
,似乎没有更改该类型的选项。
据我所知,您有三个选择:
利用Django的钩子,在创建表语句后执行原始SQL。为此,请在应用程序中创建一个名为sql
的目录,并在其中创建一个名为mymodel.postgres_psycopg2.sql
的文件。将您的alter table语句放在其中。
编写自定义字段以根据您的需要定义时间戳字段的修饰符。请参阅“编写自定义模型字段”。
将django字段保留不变,并在应用程序中执行时区转换,以确保传递正确的时间。
我个人对数据完整性的偏好是第三种。就像字符编码一样,您始终希望确保知道字符集并正确处理转换,我对日期/时间的属性(包括TZ)尽可能精确定义感到更加舒适。您今天可以确定所有输入都已经以UTC的形式传递给应用程序,但这可能会改变,特别是如果时间戳由最终用户提供。值得一提的是,我会额外付出努力,在应用程序中将时间戳转换为UTC,并将其存储在DB中,使用UTC作为时区。