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

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


当前回答

在python 3和django 3中,这是在我的项目中工作的:

def save_model(self, request, obj, form, change):
   if not change:
      #put your code here when adding a new object.

其他回答

这是否适用于上述所有场景?

if self.pk is not None and <ModelName>.objects.filter(pk=self.pk).exists():
...

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

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

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

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

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

我是从这一页上得到的

对于一个解决方案,即使你有一个UUIDField作为主键(正如其他人所注意到的,如果你只是覆盖save,它也不是None),你也可以插入Django的post_save信号。将此添加到models.py中:

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=MyModel)
def mymodel_saved(sender, instance, created, **kwargs):
    if created:
        # do extra work on your instance, e.g.
        # instance.generate_avatar()
        # instance.send_email_notification()
        pass

这个回调会阻塞save方法,所以你可以做一些事情,比如触发通知或在响应通过网络发送回之前进一步更新模型,无论你是使用表单还是Django REST框架进行AJAX调用。当然,要负责任地使用,并将繁重的任务卸载到作业队列中,而不是让用户等待:)

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