我们有一个Django后端的运行实例.在一些型号上,我们使用Charfield作为主键,因为它是满足旧需求的最佳解决方案.现在我们需要添加一个基本的int id,如下所示

id = models.AutoField(primary_key=True)

让老查菲尔德保持primary_key=False岁.

我从旧的主键属性中删除了primary_key=True标志,并触发了./manage.py makemigrations.如果我没有声明任何主键,Django会像上面提到的那样生成它的普通id.但是在trigger之后,Djang会要求这个模型的旧条目的默认值,比如:

It is impossible to add a non-nullable field 'id' to anrede without specifying a default. This is because the database needs something to populate existing rows.
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit and manually define a default value in models.py.

因为它是唯一的字段,所以我不能使用任何静态内容.那么,如何才能在不删除旧迁移的情况下仍然进行迁移呢?

推荐答案

实现这一点的通常方法是:

  1. 向模型中添加一个新的(非唯一的、可为空的)id字段并生成迁移脚本.
  2. 写入data migration,以递增方式填充现有记录的id列.
  3. 在新的id字段中添加primary_key=True(删除null=True)并生成迁移脚本.

现在,您将拥有3个迁移,当按该顺序执行时,它们应该会执行您想要的操作.

请注意,您还应使用sqlsequencereset管理命令重置自动递增计数器.您还应该考虑引用此模型的外键(如果有).

Django相关问答推荐

如何在Django表单中传递self.请求数据?

在Python中向函数的查询列表添加条件

试图找出投票的总数,但无法理解它是如何在序列化器中完成的.我是Django的新手,它是如何完成的?

身份验证有效,但登录无效.一直卡在pending

Django 相当于子查询

如何将多个模型添加到单个列表视图?

使用 Pytest 在 Django 中编写测试用例时如何加载特定目录中的所有固定装置

来自 Django 应用程序的日志(log)消息未上传到 AWS CloudWatch

Django - 将 HTML 输出转换为变量

Django,如何从模型表单的 Select 字段中删除空白 Select ?

Apache + mod_wsgi 与 nginx + gunicorn

Django:创建索引:非唯一,多列

related_name 参数在 Django 模型中没有按预期工作?

模拟 Django 查询集以测试采用查询集的函数

Celery - 在一台服务器上运行不同的工作人员

保存前向 ModelForm 对象添加数据

如何将本地文件分配给 Django 中的 FileField?

Django 在 css 文件中使用背景图像的方法

如何更改模型标签并给它一个自定义名称

django用q个对象动态过滤