首页 > 解决方案 > 恢复数据库后如何创建 Django 对象以避免重复键错误?

问题描述

在 Django 中,当您使用 Django 辅助函数(如“create_user”)或对象的“创建”方法创建对象时,Django 会自动为该新对象创建一个自动递增的主键:

user = User.objects.create_user(username='foo', password='bar')
user.save()   # id = 1

account = Account.objects.create(user=user)
account.save()   # id = 1

但是在现实世界中,如果您的服务器崩溃并且您必须重建数据库服务器然后重新加载所有数据,那么您第一次尝试创建新对象时,您将收到此类错误:

django.db.utils.IntegrityError: duplicate key value violates unique constraint "new-object_pkey"

每当你创建一个新的模型实例时,Django 似乎假设你从一个干净的新数据库开始,它为新对象分配一个 id 1,即使你必须恢复数据库,你已经在已恢复的 id 为 1 的表。

使用 Django 的辅助函数和对象“create”方法来避免这种情况的“Django 方式”是什么?我认为这对于任何生产 Django 网站来说都是一个常见问题,并且 Django 会识别并自动处理它。但我没有看到任何地方讨论过这样的解决方案。你如何避免这种情况?

更新

我发现了解决方案。Django 不选择主键,您的数据库会。在我描述的情况下,您需要针对您的模型运行 Django 的“sqlsequencereset”命令。我会在几天内回答我自己的问题,详细说明我是如何做到的。

标签: djangodjango-models

解决方案


推荐阅读