小编典典

Django auto_now 和 auto_now_add

all

对于 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,

这值得关注吗?

附带问题:在我的管理工具中,这两个字段没有显示。这是预期的吗?


阅读 108

收藏
2022-04-08

共1个答案

小编典典

具有属性集的任何字段auto_now也将继承editable=False,因此不会显示在管理面板中。过去一直在谈论让auto_nowandauto_now_add参数消失,虽然它们仍然存在,但我觉得你最好只使用自定义save()方法

因此,为了使其正常工作,我建议不要使用auto_noworauto_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()vs. datetime.datetime.now(),因为它会datetime.datetime根据settings.USE_TZ.

为了解决 OP 看到错误的原因,我不确切知道,但它看起来created甚至根本没有被填充,尽管有auto_now_add=True.
对我来说,它是一个错误,并强调了上面我的小列表中的第 1 项: auto_now并且auto_now_add充其量是片状的。

2022-04-08