7

我正在为启用时区支持的 Django 1.4.3 项目使用 South 0.7.6 创建模式迁移。

架构迁移包括在一个表上添加DateTimeField(with )。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 辅助类,那么我如何在这里给出一个时区感知的默认值呢?

4

3 回答 3

6

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

from django.utils import timezone

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

于 2013-01-16T16:11:20.917 回答
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),
于 2013-11-01T03:07:48.753 回答
0

我注意到当我在开发机器上运行迁移时,它与我在生产中运行它们时不同。

我在文件顶部的开发机器有

    from south_utils import datetime_utils as datetime

它在哪里生成

    import datetime

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

于 2015-06-30T20:59:41.727 回答