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_nowauto_now_add的论证已经消失,虽然它们仍然存在,但我觉得你最好只是使用自定义的save()方法。
所以,为了使其正常工作,我建议不要使用auto_nowauto_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()而不是依靠这些字段参数的原因是双重的:

  1. 上述的起伏与可靠性。这些论据很大程度上依赖于Django知道如何与日期/时间戳字段进行交互的每种类型的数据库的方式,并且似乎在每个版本之间断开和/或更改。 (我认为是把它们完全删除的呼唤的动力)。
  2. 事实上,它们只适用于DateField,DateTimeField和TimeField,并且通过使用这种技术,您可以在每次保存项目时自动填充任何字段类型。
  3. 使用django.utils.timezone.now()datetime.datetime.now(),因为它将根据settings.USE_TZ返回TZ感知或幼稚datetime.datetime对象。

为了解决OP为什么看到错误,我不知道,尽管有auto_now_add=True,但是看起来像created甚至没有被填充。对我来说,它突出了一个错误,并强调了上面我的小列表中的项目#1:auto_nowauto_now_add最多是片状的。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Django auto_now and auto_now_add

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

70 − = 67