【问题标题】:Why can't I delete a model instance with related objects?为什么我不能删除具有相关对象的模型实例?
【发布时间】:2013-06-22 00:21:28
【问题描述】:

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

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”
详细信息:键 (id)=(6439) 仍从表“core_unfollowing”中引用。

有什么关系?删除关联的User 时,不应该自动删除相关的Unfollowing 对象吗?值得一提的是,我在Unfollowing.sourceUnfollowing.target 中都添加了一个明确的on_delete=models.CASCADE(尽管这是默认设置),但我仍然遇到同样的错误。

【问题讨论】:

  • 您不是偶然使用代理模型(和较旧的 Django)吗? code.djangoproject.com/ticket/16128
  • @karthikr: on_delete 是模型字段的参数:docs.djangoproject.com/en/1.4/ref/models/fields/…
  • @TimmyO'Mahony:不,不是代理模型。
  • 另外(和推测)可能与 User 模型有两个 FK 和 on_delete 不能同时关注 related_names 有关系吗?
  • @TimmyO'Mahony:我也是这么想的,但是通过user.unfollowings_by.all().delete(); user.unfollowings_of.all().delete(); user.delete()明确删除相关模型导致了类似的错误。

标签: sql django django-models


【解决方案1】:

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

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

在我看来,这比 Django 更像是一个与数据库引擎相关的错误。如果您 100% 肯定 ON DELETE CASCADE 在 auth_user 表和相关表中被激活,那么您可以尝试直接从您的 sql 客户端删除用户。如果它有效,并且同一用户给你带来了 Django 的麻烦(或类似的用户,因为你删除了第一个用户),那么尝试转储 Django 正在执行的 SQL 查询并从你的 sql 客户端重复它。

这是我将采取的方法。此外,检查特定用户或每个用户是否发生这种情况,检查未关注表中的悬挂引用。也许还有一张您曾经拥有的旧桌子,这就是给您带来问题的桌子。

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

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

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

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-07
    • 2016-06-05
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多