Django admin"重复键值违反了唯一约束"密钥(user_id)=(1)已存在

时间:2015-01-03 21:29:11

标签: django postgresql

当我尝试通过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.

以下是我的Google个人资料模型:

#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我改为外键(多对一),这可以解释为什么有一个独特的约束问题。但是应该运行manage.py makemigrations and migrate来解决问题吗?知道如何手动解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

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

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;