2009-12-08 135 views
3

我正在使用Django应用程序,我需要以UTC保存所有postgres表示的日期时间字段(他们应该)。当我使用日期时间字段创建模型时,他们将数据库表示形式生成为“时间戳,时区为”。 尽管我可以手动修改表格以从字段中删除时区,但我想知道DateTime模型字段是否有能力不这样做 - 即为某些字段创建“时间戳带有时区”。 这可能吗?或者我必须改变它们的表格? 谢谢, HarelDjango DateTime字段生成没有时区的时间戳字段

回答

4

Django中postgres的数据类型映射到字符串文字timestamp with time zone,似乎没有改变该类型的选项。

据我所知,你有三种选择:

  1. 充分利用Django的钩执行raw sql after the create table statement。为此,请在您的应用中创建一个名为sql的目录,并在该目录中创建一个名为mymodel.postgres_psycopg2.sql的文件。将您的alter table语句放在那里。

  2. 编写自定义字段以根据需要定义时间戳字段的修饰符。参见“writing custom model fields”。

  3. 让django字段保持原样,并在应用程序中执行时区转换,以便您完全确定您正在传递正确的时间。

我个人对数据完整性的偏好是#3。就像字符编码一样,在那里你总是想知道字符集并正确处理转换,对于其属性(包括TZ)被精确定义的日期/时间,我感觉更加舒适。您今天可能确定您的所有输入已经以UTC来到您的应用程序,但可能会发生变化,特别是如果时间戳由最终用户提供。对于它的价值,我会多花一点时间,将应用程序中的时间戳转换为UTC,然后将其存储在数据库中,以UTC作为时区。

+0

谢谢Jarret, 我在我的应用程序中进行时区转换,因为我不信任任何具有时区的人; o)我打算将所有日期存储为UTC,并且由于我知道用户的时区,所有用户输入的日期都将转换为UTC,然后将任何内容保存到数据库。 但是,我想将创建/修改日期当作UTC来处理,但是好像Django会在字段中保存时区偏移量,即使我的settings.TIMEZONE是UTC(如果我在第25天保存了创建日期将它保存为+01的偏移量,因为英国在DST那一次。因此,为什么我想杀死db tz info。 – Harel 2009-12-08 20:29:07

+0

有道理......在这种情况下,我会投票选择上面的选项# – 2009-12-08 20:32:37

+1

另一种选择是以UTC运行服务器本身。 http://serverfault.com/questions/14685/local-timezones-on-servers-considered-harmful – Harel 2009-12-08 22:21:02

相关问题