如何在Django的model.save()中检测模型的新实例

Siv*_*lam 17 django django-models

在覆盖特定模型的save()方法时,是否可以确定它是新记录还是更新?

Tho*_*mel 53

如果self.pkNone新纪录.

def save(self):
    if self.pk is None:
        self.created = datetime.today()
    self.modified = datetime.today()
    super(ProjectCost, self).save()
Run Code Online (Sandbox Code Playgroud)

这个主题也在这里讨论

  • 如果你使用UUIDField作为pk,pk不是"None" - 即使实例是新的. (7认同)
  • 请注意,Django有内置关键字来记录对象创建和修改日期:你可以在模型定义中使用`DateTimeField`的`auto_now`和`auto_now_add`参数. (2认同)

Gor*_*ley 5

现代 Django 的首选解决方案是检查 self._state.adding

不幸的是,目前还没有记录,但是有一个开放的任务可以这样做 https://code.djangoproject.com/ticket/31502

  • @ExTexan 整个下划线私有的东西是一个约定。您可以选择让下划线表示其他含义,或者根本不表示任何含义。关于 Django,他们声明 _state 和 _meta 是公共 API,您可以免费使用。它们的名称以下划线开头,以防止与用户字段发生冲突。不是因为它们是私人的。 (2认同)