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

时间:2021-02-21 17:35:15

标签: python django django-models django-signals

我们的网站使用 Django 3.1。我们有一个模型 User,它与两个网站的两个 SiteProfile 模型相关,也与其他模型(例如 FriendUserEmailAddress)相关。所有的关系都与on_delete=models.CASCADE。我们还为 models.signals.post_delete 等模型提供了 Friend 信号,用于更新用户拥有的朋友数量,该数量保存在 SiteProfile 模型之一中。但问题是,删除用户时,会调用信号,然后保存 SiteProfile 对象,然后我收到 django.db.utils.IntegrityError 的异常 - 违反外键。我们曾经在 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 模型。

0 个答案:

没有答案