升级到Django 1.8后,"提供了固定的默认值"

Tro*_*roy 23 django django-1.8

Django 1.8现在对模型有一些问题检测,这很好.然而,对于它给我的一个警告,我理解这个问题,但我不明白它给我的暗示是否更好.

这是我的(坏)模型字段:

my_date = DateField(default=datetime.now())
Run Code Online (Sandbox Code Playgroud)

而且很容易看出为什么那么糟糕.但这是它给我的暗示:

MyMoel.my_date:(fields.W161)提供了固定的默认值.
    提示:您似乎将此固定日期/时间/日期时间值设置为此字段的默认值.这可能不是你想要的.如果要将当前日期设置为默认值,请使用`django.utils.timezone.now`

所以,它说要使用timezone.now,但它有什么比这更好的datetime.now?它们都是 "固定默认值"... timezone.now返回一个日期时间实例,这是一个固定值...

我怀疑它实际上是否要我插入某种标语" timezone.now 后来使用".但那并不是暗示说的......那么那面旗帜是什么?

knb*_*nbk 67

datetime.now()导入代码后,即(重新)启动服务器时,该功能将立即执行.所有后续模型实例都具有相同的值.

相反,您应该传递一个可调用函数default,每次模型实例需要一个默认值时执行该函数.提示想传达你应该在DateField(default=django.utils.timezone.now)没有括号的情况下使用.

该消息有点误导,但Django不知道你是否使用datetime.now()django.utils.timezone.now().

  • 因此,给它任何可调用将使验证器满意(即我可以传递“datetime.now”或“timezone.now”,或任何返回日期的函数)? (2认同)

Dhr*_*ruv 10

timezone.now()和之间的区别datetime.now()在上面的答案中已经很好地解释了。但是,您收到错误的原因是因为您正在运行的函数会将默认时间设置为将迁移应用到数据库时的时间。

你所要做的就是使用,

my_date = DateField(default=datetime.now)
Run Code Online (Sandbox Code Playgroud)

代替

my_date = DateField(default=datetime.now())
Run Code Online (Sandbox Code Playgroud)

在上面的方法中,timezone.now在插入/修改对象时将调用该函数。