我想在保存新记录(而不是更新现有记录)时,在Django模型对象的save()方法中触发一个特殊操作。

是检查(self。id != None)有必要且充分地保证自我记录是新的且没有被更新?有没有可能被忽略的特殊情况?


当前回答

自我检查。Id假设Id是模型的主键。更通用的方法是使用pk快捷方式。

Is_new = self。pk为None

其他回答

更新:与本人澄清。_state不是私有实例变量,但这样命名是为了避免冲突,检查self._state。加法现在是更好的检查方法。


self.pk is None:

在一个新的Model对象中返回True,除非对象有一个UUIDField作为它的主键。

您可能不得不担心的极端情况是,除了id之外的字段是否存在唯一性约束(例如,其他字段上的次要惟一索引)。在这种情况下,您可能仍然拥有一条新记录,但无法保存它。

我很晚才谈这个话题,但我遇到了自我的问题。当Pk具有与之关联的默认值时,将填充它。

我解决这个问题的方法是在模型中添加一个date_created字段

date_created = models.DateTimeField(auto_now_add=True)

你可以从这里出发

Created = self。date_created为None

这是常见的做法。

id将在第一次保存到db时给出

检查自我的另一种方法。我们可以检查self。模型的状态

self._state。添加才是真正的创造

self._state。添加是错误的更新

我是从这一页上得到的

检查self。Id和force_insert标志。

if not self.pk or kwargs.get('force_insert', False):
    self.created = True

# call save method.
super(self.__class__, self).save(*args, **kwargs)

#Do all your post save actions in the if block.
if getattr(self, 'created', False):
    # So something
    # Do something else

这很方便,因为您新创建的对象(self)具有它的pk值