对于Django 1.1。

我在我的models.py中有这个:

class User(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

当更新一行时,我得到:

[Sun Nov 15 02:18:12 2009] [error] /home/ptarjan/projects/twitter-meme/django/db/backends/mysql/base.py:84: Warning: Column 'created' cannot be null
[Sun Nov 15 02:18:12 2009] [error]   return self.cursor.execute(query, args)

我的数据库的相关部分是:

  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,

这值得关注吗?

小问题:在我的管理工具中,这两个字段没有显示。这是意料之中的吗?


当前回答

说一个题外话:如果你想在管理中看到这些字段(虽然,你不能编辑它),你可以把readonly_fields添加到你的管理类中。

class SomeAdmin(ModelAdmin):
    readonly_fields = ("created","modified",)

好吧,这只适用于最新的Django版本(我相信是1.3及以上版本)

其他回答

我认为这里最简单(也许也是最优雅)的解决方案是利用可以将default设置为可调用对象这一事实。所以,为了避开管理员对auto_now的特殊处理,你可以像这样声明字段:

from django.utils import timezone
date_field = models.DateField(default=timezone.now)

重要的是,不要使用timezone.now(),因为默认值不会更新(即,只有在加载代码时才设置默认值)。如果您发现自己经常这样做,您可以创建一个自定义字段。然而,我认为这已经相当DRY了。

说一个题外话:如果你想在管理中看到这些字段(虽然,你不能编辑它),你可以把readonly_fields添加到你的管理类中。

class SomeAdmin(ModelAdmin):
    readonly_fields = ("created","modified",)

好吧,这只适用于最新的Django版本(我相信是1.3及以上版本)

class Feedback(models.Model):
    feedback = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

在这里,我们创建了列,并在列创建时和有人修改反馈时使用时间戳进行更新。

Auto_now_add将设置实例创建的时间,而auto_now将设置某人修改反馈的时间。

这值得关注吗?

不,在保存模型时,Django会自动为你添加它,所以,这是意料之中的。

辅助问题:在我的管理工具中,这两个字段没有显示。这是意料之中的吗?

由于这些字段是自动添加的,所以不会显示它们。

为了补充上面的内容,正如synack所说,django邮件列表中一直有关于删除它的争论,因为它“设计得不好”,是“一个黑客”。

在我的每个模型上编写自定义save()比使用auto_now要痛苦得多

显然,你不需要对每个模型都写。您可以将它写入一个模型,并从它继承其他模型。

但是,由于存在auto_add和auto_now_add,我宁愿使用它们,而不是自己尝试编写方法。

至于你的管理显示,请看这个答案。

注意:auto_now和auto_now_add默认设置为editable=False,这就是为什么适用这个。