我正在尝试向接收器添加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()
为什么会出现此错误,我该如何解决?
答案 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()