Django使用on_delete=models.CASCADE删除用户会导致signals.post_delete出现问题

2024-09-27 21:26:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我们的网站使用Django3.1。我们有一个模型User,它与两个网站的两个SiteProfile模型相关,也与其他模型相关,如FriendUserEmailAddress。所有关系都与on_delete=models.CASCADE有关。我们还为models.signals.post_delete等模型提供了Friend信号,以更新用户拥有的朋友数量,该数量保存在一个SiteProfile模型中。但是问题是,当删除一个用户时,会调用信号,然后保存SiteProfile对象,然后我会得到一个违反外键的异常。我们以前在UserEmailAddress模型(用户的电子邮件地址)上也有同样的问题,我用以下代码修复了这个问题:

def delete(self, *args, **kwargs):
    if ((self.is_staff) or (self.is_superuser)):
        warnings.warn('Can’t delete staff user.')
        return False
    else:
        with transaction.atomic():
            for user_email_address in self.email_addresses.all():
                user_email_address.delete()
            return_value = super().delete(*args, **kwargs)
        return return_value

但是我想知道,有没有更好的方法来删除一个用户及其所有相关对象,这些对象具有on_delete=models.CASCADE,但不将models.signals.post_delete中的计数器保存到数据库中?我是否可以在models.signals.post_delete中检查一些内容,以了解用户是否正在被删除,然后不保存计数器?因为我不想特别删除def delete方法中的任何相关对象,所以至少有5个这样的模型不包括这两个SiteProfile模型


Tags: 对象用户模型selffriendreturn网站models

热门问题