【问题标题】:Django admin "duplicate key value violates unique constraint" Key (user_id)=(1) already existsDjango admin“重复键值违反唯一约束”键(user_id)=(1)已经存在
【发布时间】:2015-03-01 19:44:11
【问题描述】:

只有当我尝试通过 django 管理站点更新任何内容时才会发生这种情况。否则我没有问题。我得到的错误是:

IntegrityError at /admin/ledger/user/1/
duplicate key value violates unique constraint "ledger_googleprofile_user_id_key"
DETAIL:  Key (user_id)=(1) already exists.

这是我的谷歌个人资料模型的样子:

#ledger.models
class GoogleProfile(models.Model):
    plus_id = models.CharField(max_length=2000, null=True, blank=True)
    info = JSONField(null=True, blank=True)
    youtube_info = JSONField(null=True, blank=True)
    user = models.ForeignKey('User', related_name='google_profile', blank=True, null=True)

我尝试运行python manage.py sqlsequencereset ledger,然后将其粘贴到psql 中,但这并不能解决问题。这很奇怪,因为即使没有与之关联的 GoogleProfile 的用户在尝试保存在管理员中时仍然会抛出此错误。

关于问题可能是什么的任何想法。我宁愿不必删除我的生产数据库并重新开始......

写完之后,我认为问题可能是因为GoogleProfile.user 字段之前可能是oneToOne。我不是很积极,但我认为我将 oneToOne 更改为 ForeignKey(多对一),这可以解释为什么唯一约束存在问题。但是运行manage.py makemigrations and migrate 应该解决问题吗?知道如何手动解决这个问题吗?

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    要手动删除约束,请运行以下命令仔细检查约束名称:

    SELECT *
    FROM information_schema.constraint_table_usage
    WHERE table_name = 'ledger_googleprofile';
    

    然后

    ALTER TABLE ledger_googleprofile DROP CONSTRAINT constraint_name;
    

    鉴于您发布的错误,我猜实际的 SQL 如下所示,但我会运行 SELECT 查询来仔细检查:

    ALTER TABLE ledger_googleprofile DROP CONSTRAINT ledger_googleprofile_user_id_key;
    

    【讨论】:

    • 我发现我只需要删除约束,但我不知道如何获取约束的名称。你是对的,它一直在我面前'ledger_googleprofile_user_id_key'。谢谢。
    • 一直在努力解决这个问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 2016-06-12
    • 2016-11-27
    • 2018-03-14
    • 2012-12-31
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多