【问题标题】:django post_save signals on updatedjango post_save 更新信号
【发布时间】:2011-09-11 02:06:48
【问题描述】:

我正在尝试设置一些类似于以下的 post_save 接收器

@receiver(post_save, sender=Game, dispatch_uid='game_updated')
def game_updated(sender, **kwargs):

    '''DO SOME STUFF HERE'''

    MyPick.objects.filter(week=game.week, team=game.home_team).update(result=home_result)
    MyPick.objects.filter(week=game.week, team=game.away_team).update(result=away_result)


@receiver(post_save, sender=MyPick, dispatch_uid='user_pick_updated')
def update_standings(sender, **kwargs):
    '''DO STUFF'''

第一个接收器在 Game 对象更新后被正确调用,但是对 MyPick 对象的更新调用不会导致第二个接收器被调用。 post_save 信号在更新时不起作用还是我在这里遗漏了其他东西?

谢谢

【问题讨论】:

    标签: django django-signals


    【解决方案1】:

    update() is converted directly to an SQL statement;它不会在模型实例上调用save(),因此不会发出pre_savepost_save 信号。如果您希望调用信号接收器,则应遍历查询集,并为每个模型实例进行更改并自己调用 save()

    【讨论】:

    • @SilverLight,模型实例上的update 方法发出pre_save。查询集上的 update 方法没有。
    • 再明确一点:模型实例上的update 方法是否也发出post_save,还是只发出pre_save
    • 但是...是什么让我想知道...update_or_create 触发post_save 信号。
    • 因为update_or_create方法中有一个save。但不在update 方法中。 github.com/django/django/blob/…
    【解决方案2】:

    @Ismali Badawi 的回答还有一件事。


    调用 post_save

    user = User.objects.get(id=1) 
    user.username='edited_username' 
    user.save()
    

    这个不会调用post_save

    User.objects.filter(id=1).update(username='edited_username')
    

    在代码中,

    from django.db.models.signals import post_save
    
    @receiver(post_save, sender=User)
    def do_something_when_user_updated(sender, instance, created, **kwargs):
        if not created:
            # User object updated
            user_obj = instance
            pass
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 2014-12-18
      • 1970-01-01
      • 2012-05-31
      • 2012-10-12
      • 2017-10-10
      相关资源
      最近更新 更多