Django DateTime字段生成不带时区的时间戳字段

3

我正在开发一个Django应用程序,其中需要将所有的postgres日期时间字段保存为UTC时间(这是应该的)。当我创建带有DateTime字段的模型时,它们在数据库中的表示形式生成为“timestamp with time zone”。 虽然我可以手动更改表格以从字段中删除时区,但我想知道DateTime模型字段是否具有不执行此操作的能力 - 即为某些字段创建“timestamp without time zone”。 这是可能的吗?还是我必须更改表格? 谢谢, Harel

1个回答

4

在Django中,Postgres的数据类型映射为字符串字面量timestamp with time zone,似乎没有更改该类型的选项。

据我所知,您有三个选择:

  1. 利用Django的钩子,在创建表语句后执行原始SQL。为此,请在应用程序中创建一个名为sql的目录,并在其中创建一个名为mymodel.postgres_psycopg2.sql的文件。将您的alter table语句放在其中。

  2. 编写自定义字段以根据您的需要定义时间戳字段的修饰符。请参阅“编写自定义模型字段”。

  3. 将django字段保留不变,并在应用程序中执行时区转换,以确保传递正确的时间。

我个人对数据完整性的偏好是第三种。就像字符编码一样,您始终希望确保知道字符集并正确处理转换,我对日期/时间的属性(包括TZ)尽可能精确定义感到更加舒适。您今天可以确定所有输入都已经以UTC的形式传递给应用程序,但这可能会改变,特别是如果时间戳由最终用户提供。值得一提的是,我会额外付出努力,在应用程序中将时间戳转换为UTC,并将其存储在DB中,使用UTC作为时区。


谢谢Jarret, 我在我的应用程序中进行时区转换,因为我不相信任何人的时区;o) 我打算将所有日期存储为UTC,并且由于我知道用户的时区,所有用户输入的日期在保存到数据库之前都会转换为UTC。 然而,我希望将创建/修改日期也视为UTC,但是似乎Django会在字段中保存时区偏移量,即使我的settings.TIMEZONE是UTC(如果我将创建日期保存在11月25日,它会将其保存为+01偏移量,因为当时英国处于夏令时)。因此,我想删除数据库的时区信息。 - Harel
1
另一种选择是在UTC中运行服务器本身。 - Harel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接