我们的网站使用 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
模型。