Django多个信号带一个接收器



我正在尝试向接收器添加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()

为什么我会遇到此错误?我该如何解决?

post_delete signal [django-doc] dis not 发送 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,但这确实是 not> not 表示该实例已被删除。此外,如果您更新模型实例,则可以暗示target/follower更改,因此您应该减少计数。

此外,无论如何,使用信号来计算关注者数量可能不是一个好主意,因为确定的django orm呼叫可以 bypass 信号。最好用Following s的数量注释对象。如果使用信号,则需要定期运行与金额同步的查询。

我猜post_delete信号签名不包括"创建"参数 - post_deleted上下文中"创建"的含义是什么?

一个解决方案是:

@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()

最新更新