如何解决Django - 使用 on_delete=models.CASCADE 删除用户会导致signals.post_delete 出现问题
我们的网站使用 Django 3.1。我们有一个模型 User
,它与两个网站的两个 SiteProfile
模型相关,也与其他模型(例如 Friend
和 UserEmailAddress
)相关。所有的关系都与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
模型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。