我有一个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_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
这样的方式修改迁移脚本?
在更改该列的名称时,保留该列中的数据的最佳方法是什么?
related_name
来实现 => 如果保持不变,Django将检测到该字段已被重命名。 - lapinDROP/SET CONSTRAINT
)。我是通过切身经历学到的(在生产环境中)。我创建了一个 Django 票据,并提出请求以解决这些情况。 https://code.djangoproject.com/ticket/31825 https://code.djangoproject.com/ticket/31826话虽如此,您可以使用manage.py sqlmigrate <app_name> <migration>
来检查它将运行的 SQL 命令。这取决于数据库,因此请使用与生产环境中相同类型的数据库来运行它。 - iurisilviomigrations.AlterField( model_name='invoice', name='payment', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='billing.Payment', db_column='payment'), ), migrations.RenameField( model_name='invoice', old_name='payment', new_name='_deprecated_payment', ),
- yogi