Django带有一个接收器的多个信号

时间:2019-07-06 01:04:03

标签: django django-models

我正在尝试向接收器添加post_savepost_delete信号。但是,我收到一条错误消息:TypeError: change_followers() missing 1 required positional argument: 'created'

@receiver([post_save, post_delete], sender=Following)
def change_followers(instance, created, **kwargs):
    if created:
        instance.follower.following_count += 1
        instance.target.follower_count +=1
        instance.save()
    else:
        instance.follower.following_count -= 1
        instance.target.follower_count -=1
        instance.save()

为什么会出现此错误,我该如何解决?

2 个答案:

答案 0 :(得分:0)

post_delete signal [Django-doc]不会发送一个created参数。

不过,您可以通过在参数中添加默认值来轻松解决此问题:

@receiver([post_save, post_delete], sender=Following)
def change_followers(instance, created=False, **kwargs):
    if created:
        instance.follower.following_count += 1
        instance.target.follower_count +=1
        instance.save()
    else:
        instance.follower.following_count -= 1
        instance.target.follower_count -=1
        instance.save()

请注意,逻辑仍然不正确:因为如果您更新模型实例,则会触发post_save,但这不是 的意思。该实例将被删除。此外,如果您更新模型实例,则可能意味着target / follower发生了变化,因此您应该减少该计数。

此外,使用信号来计算关注者人数可能也不是一个好主意,因为某些Django ORM调用可以绕过。最好用Following的数量注释对象。如果使用信号,则需要定期运行查询以使金额同步。

答案 1 :(得分:0)

我猜post_delete信号签名不包含“ created”参数-post_deleted上下文中“ created”的含义是什么?

一种解决方案是:

@receiver([post_save, post_delete], sender=Following)
def change_followers(instance, **kwargs):
    if kwargs.get("created"):
        instance.follower.following_count += 1
        instance.target.follower_count +=1
        instance.save()
    else:
        instance.follower.following_count -= 1
        instance.target.follower_count -=1
        instance.save()