对于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_nowand auto_now_add参数消失的讨论,尽管它们仍然存在,但我认为你最好只使用自定义save()方法。
auto_now
editable=False
auto_nowand auto_now_add
因此,为了使其正常工作,我建议不要使用auto_now或auto_now_add而是定义自己的save()方法以确保created仅在id未设置的情况下(例如,首次创建该项目时)才对其进行更新,并使其在modified每次该项目时都进行更新已保存。
auto_now_add
save()
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()与依赖这些字段参数的原因有两个:
DateField,DateTimeField
TimeField
django.utils.timezone.now()vs. datetime.datetime.now()
datetime.datetime
settings.USE_TZ
auto_now_add=True
bug