django将旧的datetime字段转换为新的1.4 datetime,并在SQLite中识别时区

时间:2012-04-05 19:29:35

标签: django django-models

我有一个django 1.3项目,我正在添加将按特定时间表运行的文本通知。因此,我将需要应用程序时区识别。看起来django 1.4处理得非常好。问题是我使用SQLite for db,它不存储时区信息,所以我必须转换。我是一个django新手。关于如何将SQLlite中的datetime字段转换为时区感知字段的任何建议。

顺便说一句,当我升级到django 1.4并激活时区支持后启动manage.py shell时,我收到以下消息:

RuntimeWarning: SQLite received a naive datetime (2012-04-05 15:18:49.939725) while 
time zone support is active. RuntimeWarning)

谢谢!

1 个答案:

答案 0 :(得分:4)

您不会将SQlite中的日期时间字段转换为时区感知字段。在SQlite中,日期时间仍然是天真的,但转换为UTC。并且在应用程序级别可以获得时区感知日期时间。

例如,当您从SQlite查询Model实例时,它有一个datetime字段,Django:

  1. 从SQLite获取天真的日期时间,将其设置为UTC时区的知晓日期时间
  2. 那么当你访问model_instance.datetime_field时,它已经知道时区并且已经本地化为UTC
  3. 然后在模板中,您可以将其本地化为当前时区
  4. 编辑:更正了我最初的错误答案,了解了您在模型实例上获得的内容。

    如果当前SQlite数据库中的日期时间不是UTC,则需要进行一次性迁移,将它们全部转换为UTC。 (以及UTC我只是指天真的UTC值。作为SQlite - 以及MySQL - 没有存储时区信息的日期时间字段)

    我建议您仔细而彻底地阅读与时区相关的文档:https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/

    这很容易弄错。

    是的,对于你的代码“给”Django的天真日期时间进行保存的每个实例,你都会获得RunTimeWarning。你必须逐步修复它们,让它们能够识别时区。