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

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


当前回答

检查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值

其他回答

要知道您是在更新还是插入对象(数据),请在表单中使用self.instance.fieldname。在表单中定义一个干净的函数,并检查当前值项是否与前一个值项相同,如果不是,则更新它。

自我。Instance和self.instance.fieldname与新值进行比较

这是常见的做法。

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

> def save_model(self, request, obj, form, change):
>         if form.instance._state.adding:
>             form.instance.author = request.user
>             super().save_model(request, obj, form, change)
>         else:
>             obj.updated_by = request.user.username
> 
>             super().save_model(request, obj, form, change)

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

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

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

我是从这一页上得到的

你可以连接到post_save信号,发送一个“创建”kwargs,如果为真,你的对象已经插入。

http://docs.djangoproject.com/en/stable/ref/signals/#post-save