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