gpt4 book ai didi

django-models - 在不丢失数据的情况下迁移 django-model 字段名称更改

转载 作者:行者123 更新时间:2023-12-03 07:55:05 25 4
gpt4 key购买 nike

我有一个带有已经包含数据的数据库表的 django 项目。我想在不丢失该列中的任何数据的情况下更改字段名称。我最初的计划是简单地更改模型字段名称,而不会实际更改 db 表的名称(使用 db_column 列参数):

原始模型:

class Foo(models.Model):
orig_name = models.CharField(max_length=50)

新型号:
class Foo(models.Model):
name = models.CharField(max_length=50, db_column='orig_name')

但是,运行 South 的 schemamigration --auto生成一个删除原始列的迁移脚本, orig_name ,并添加一个新列, name ,这会产生删除该列中数据的不良副作用。 (我也很困惑为什么 South 想要更改 db 中列的名称,因为我对 db_column 的理解是它可以在不更改数据库表列名称的情况下更改模型字段名称)。

如果我不能在不更改 db 字段的情况下更改模型字段,我想我可以做一个更直接的名称更改,如下所示:

原始模型:
class Foo(models.Model):
orig_name = models.CharField(max_length=50)

新型号:
class Foo(models.Model):
name = models.CharField(max_length=50)

无论我最终使用哪种策略(我更喜欢第一个,但会发现第二个可以接受),我主要关心的是确保我不会丢失该列中已有的数据。

这是否需要一个多步骤的过程? (如1.添加一列,2.将旧列的数据迁移到新列,3.移除原列)
或者我可以使用类似 db.alter_column 的内容更改迁移脚本吗? ?

在更改列名称时保留该列中数据的最佳方法是什么?

最佳答案

在保留 DB 字段的同时更改字段名称

添加 Django 1.8+ 的答案(使用 Django 本地迁移,而不是 South)。

进行迁移,首先添加 db_column属性,然后重命名该字段。 Django 知道第一个是空操作(因为它改变了 db_column 以保持不变),第二个是空操作(因为它没有改变架构)。我实际上检查了日志以查看没有架构更改...

operations = [
migrations.AlterField(
model_name='mymodel',
name='oldname',
field=models.BooleanField(default=False, db_column=b'oldname'),
),
migrations.RenameField(
model_name='mymodel',
old_name='oldname',
new_name='newname',
),
]

关于django-models - 在不丢失数据的情况下迁移 django-model 字段名称更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3498140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com