为什么我不能删除带有相关对象的模型实例?

时间:2013-06-22 00:21:29

标签: sql django django-models

我正在尝试删除Django应用中的User对象,但在删除IntegrityError时,我在相关对象中不断获得User。相关对象如下所示:

class Unfollowing(models.Model):
    source = models.ForeignKey(User, related_name='unfollowings_by')
    target = models.ForeignKey(User, related_name='unfollowings_of')
    created_on = models.DateTimeField(auto_now_add=True)

但是在删除User时,我收到如下错误:

  

IntegrityError:表“auth_user”上的更新或删除违反了表“core_unfollowing”上的外键约束“source_id_refs_id_5b69e09fc6161c2a”
  DETAIL:Key(id)=(6439)仍然从“core_unfollowing”表中引用。

这笔交易是什么?删除关联的Unfollowing时,是否应自动删除相关的User个对象?为了它的价值,我向on_delete=models.CASCADEUnfollowing.source添加了一个明确的Unfollowing.target(即使这是默认设置),我仍然遇到同样的错误。

1 个答案:

答案 0 :(得分:1)

这确实很奇怪。这是我要尝试的几件事:

首先,您在添加on_delete=models.CASCADE后更新了数据库架构吗?如果没有,它将不起任何作用。您可以通过直接转储数据库架构来仔细检查是否已激活ON DELETE CASCADE,而不是从Django中找出它。

对我而言,这是一个比Django更多的数据库引擎相关错误。如果您在auth_user表和相关表中激活了100%肯定ON DELETE CASCADE,那么您可以尝试直接从您的SQL客户端删除用户。如果它工作,并且同一个用户给你Django(或类似用户,因为你删除了第一个)的麻烦,然后尝试转储Django正在做的SQL查询并从你的SQL客户端重复它。

这是我要采取的方法。另外,检查特定用户或每个用户是否发生这种情况,检查Unfollowing表中的挂起引用。也许还有一个你曾经拥有的旧桌子,那就是给你带来问题的桌子。

我会直接将研究重点放在数据库和SQL客户端上,然后我设法让它在那里工作,然后回到Django。

这是我所遵循的路径而不是答案,因为这似乎是一个非常具体的问题。

我希望这可能会有所帮助。

祝你好运!