【问题标题】:Django: how can I tell if the post_save signal triggers on a new object?Django:如何判断 post_save 信号是否在新对象上触发?
【发布时间】:2012-05-27 04:55:25
【问题描述】:

我需要对 Django 中新创建的对象进行一些后台后处理。这种后处理应该只在新对象上运行,而不是刚刚更新的对象。

我知道在 pre_save 中我可以检查对象是否有 id,如果没有,则它是一个新对象。但问题是在后处理中我需要访问 id(以便我可以将结果保存回数据库)。

我怎样才能以干净的方式做到这一点?

【问题讨论】:

标签: django django-signals


【解决方案1】:

查看文档:https://docs.djangoproject.com/en/stable/ref/signals/#post-save

有一个created 命名参数,如果它是一个新对象,它将被设置为True

【讨论】:

    【解决方案2】:

    正如Docs 和@seler 指出的那样,但举个例子:

    def keep_track_save(sender, instance, created, **kwargs):
        action = 'save' if created else 'update'
        save_duplicate((instance.id, instance.__class__.__name__, action))
    
    post_save.connect(keep_track_save, sender=Group)
    

    【讨论】:

      【解决方案3】:

      我把它留在这里,也许它会对某人有所帮助。

      from django.db import models
      from django.db.models.signals import post_save
      from django.dispatch import receiver
      
      
      class Deal(models.Model):
          name = models.CharField(max_length=255)
      
      
      @receiver(post_save, sender=Deal)
      def print_only_after_deal_created(sender, instance, created, **kwargs):
          if created:
              print(f'New deal with pk: {instance.pk} was created.')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-09
        • 2012-05-31
        • 2019-03-29
        相关资源
        最近更新 更多