对于 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,
这值得关注吗?
附带问题:在我的管理工具中,这两个字段没有显示。这是预期的吗?
具有属性集的任何字段auto_now也将继承editable=False,因此不会显示在管理面板中。过去一直在谈论让auto_nowandauto_now_add参数消失,虽然它们仍然存在,但我觉得你最好只使用自定义save()方法。
auto_now
editable=False
auto_now_add
save()
因此,为了使其正常工作,我建议不要使用auto_noworauto_now_add而是定义您自己的save()方法以确保created仅在id未设置时更新(例如首次创建项目时),并在modified每次项目时更新被保存。
created
id
modified
我用 Django 编写的其他项目也做了同样的事情,所以你save()看起来像这样:
from django.utils import timezone class User(models.Model): created = models.DateTimeField(editable=False) modified = models.DateTimeField() def save(self, *args, **kwargs): ''' On save, update timestamps ''' if not self.id: self.created = timezone.now() self.modified = timezone.now() return super(User, self).save(*args, **kwargs)
希望这可以帮助!
根据评论进行编辑:
我坚持重载save()与依赖这些字段参数的原因有两个:
django.utils.timezone.now()
datetime.datetime.now()
datetime.datetime
settings.USE_TZ
为了解决 OP 看到错误的原因,我不确切知道,但它看起来created甚至根本没有被填充,尽管有auto_now_add=True. 对我来说,它是一个错误,并强调了上面我的小列表中的第 1 项: auto_now并且auto_now_add充其量是片状的。
auto_now_add=True