首页 文章

具有激活时区支持的Django项目中用于南迁移的DateTimeField的默认值

提问于
浏览
7

我正在为我的Django 1.4.3项目创建一个使用South 0.7.6的模式迁移,并启用了时区支持 .

架构迁移包括在一个表上添加 DateTimeField (带 auto_now=True ) .

在创建迁移时,South提示我:

The field 'MyTable.my_field' does not have a default specified, yet is NOT NULL.
Since you are adding this field, you MUST specify a default
value to use for existing rows. Would you like to:
 1. Quit now, and add a default to the field in models.py
 2. Specify a one-off value to use for existing columns now

如果我不关心现有行的这个值,那么这里给出的正确的一次性值是多少(我只希望迁移成功而没有警告)?

到目前为止,我使用了 datetime.datetime.utcnow() . 但是,在应用迁移时,我得到以下内容:

C:\Python27\lib\site-packages\django\db\models\fields\__init__.py:808:
RuntimeWarning: DateTimeField received a naive datetime (2013-01-16 00:00:00)
while time zone support is active.

South似乎没有导入pytz或Django帮助程序类,那么如何在此处提供时区感知的默认值?

3 回答

  • 6

    我注意到当我在开发机器上运行迁移时,它与我在 生产环境 中运行它们时的情况不同 .

    我文件顶部的开发机器有

    from south_utils import datetime_utils as datetime
    

    它产生的 生产环境 地点

    import datetime
    

    通过用前者替换后者,它解决了我的问题,无需对迁移文件进行额外编辑 .

  • 0

    手动编辑South创建的迁移文件并添加:

    from django.utils import timezone
    

    然后在迁移文件中找到要添加的字段,并将其 default 设置为 timezone.now() .

  • 0

    pytz可用于制作时区感知日期时间对象 . 您可以在迁移文件中使用以下内容:

    import pytz
    cn_tz = pytz.timezone('Asia/Shanghai')
    

    然后在你的模型中

    self.gf('django.db.models.fields.DateTimeField')(auto_now=True, default=datetime.datetime.now(cn_tz), blank=True),
    

相关问题