django - 恢复数据库后如何创建 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”命令。我会在几天内回答我自己的问题,详细说明我是如何做到的。
解决方案
推荐阅读
- liquid - 有没有办法查看液滴上的所有手柄?
- c++ - 实现一个 C++20 概念
- javascript - 如何通过这些对象的两个属性过滤对象数组?
- nuxt.js - 将 GTM 与 Nuxt 路由更改配合
- python - 在当前解决方案(或项目)中打开 Python REPL 或在路径中使用 Python 打开 cmd 提示符:VStudio with Python
- r - 创建一个新列,其值为 1 表示每个组中的前 x 值,0 表示组中的其余值
- python - Django - 我可以使用模板标签来呈现给定 URL 路径条件的 HTML 吗?
- javascript - 在 Devtools 中编辑网站的 Javascript/源文件 - 不更新
- mfc - 如何激活位于禁用窗口 (CWnd) 中的按钮 (CButton)?
- python - 基于数据框中的一列列表创建标志