Django auto_now和auto_now_add
对于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
或auto_now_add
而是定义自己的save()
方法以确保created
仅在id
未设置的情况下(例如,首次创建该项目时)才对其进行更新,并使其在modified
每次该项目时都进行更新已保存。
我已经使用Django编写的其他项目完成了完全相同的操作,因此你save()
将如下所示:
from django.utils import timezoneclass 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知道如何与之交互的每种类型的数据库对待日期/时间戳字段的方式,并且似乎在每个发行版之间都会中断和/或更改。(我相信这是完全删除它们的呼吁的推动力)。
- 它们仅在
DateField,DateTimeField
和TimeField
上起作用,使用这种技术,你可以在每次保存项目时自动填充任何字段类型。 - 使用
django.utils.timezone.now()vs. datetime.datetime.now()
,因为它会根据来返回TZ感知或天真的datetime.datetime
对象settings.USE_TZ
。为了解决OP为何会看到错误的原因,我不知道确切的信息,但是created尽管有,但看起来根本没有被填充
auto_now_add=True
。对我来说,它是一个bug
,并且在我上面的小列表中强调了项目#1:auto_now
并且auto_now_add
充其量是片状的。
以上是 Django auto_now和auto_now_add 的全部内容, 来源链接: utcz.com/qa/418061.html