Django 1.8: Delete/rename 数据迁移中的模型字段
Django 1.8: Delete/rename a model field in data migration
我需要将模型字段的关系从 ForeignKey 更改为 ManyToManyField。这带有数据迁移,以更新预先存在的数据。
以下为原模型(models.py):
class DealBase(models.Model):
[...]
categoria = models.ForeignKey('Categoria')
[...]
)
我需要模型字段 'categoria' 与应用 'deal' 中的模型 'Categoria' 建立多对多关系 'deal'。
我做了什么:
在 DealBase
中创建一个新字段 'categoria_tmp'
class DealBase(models.Model):
categoria = models.ForeignKey('Categoria')
categoria_tmp = models.ManyToManyField('Categoria',related_name='categoria-temp')
进行架构迁移
python manage.py makemigrations
编辑 migrationfile.py 将数据从 categoria 迁移到 categoria-tmp
def copy_deal_to_dealtmp(apps, schema_editor):
DealBase = apps.get_model('deal', 'DealBase')
for deal in DealBase.objects.all():
deal.categoria_tmp.add(deal.categoria)
deal.save()
class Migration(migrations.Migration):
dependencies = [
('deal', '0017_dealbase_indirizzo'),
]
operations = [
migrations.AddField(
model_name='dealbase',
name='categoria_tmp',
field=models.ManyToManyField(related_name='categoria-temp', to='deal.Categoria'),
preserve_default=True,
),
migrations.RunPython(
copy_deal_to_dealtmp
)
]
进行数据迁移
python manage.py migrate
最后我需要删除列 'dealbase.categoria' 并将列 'dealbase.categoria-tmp' 重命名为 'dealbase.categoria'
我卡在了第 5 步。
有人能帮帮我吗?我在网上找不到答案,我使用的是 Django 1.8。
谢谢!
试试这个,可能对你有帮助。
第 1 步和你一样
python manage.py makemigrations && python manage.py migrate
打开shell
for i in DealBase.objects.all()
i.categoria_tmp.add(i.categoria)
删除您的字段categoria
python manage.py makemigrations && python manage.py migrate
添加字段
categoria = models.ManyToManyField('Categoria',related_name='categoria-temp')
然后
python manage.py makemigrations && python manage.py migrate
打开shell
for i in DealBase.objects.all():
for j in i.categoria_tmp.all():
i.categoria.add(j)
删除字段categoria_tmp
python manage.py makemigrations && python manage.py migrate
您只需创建两个额外的迁移:一个用于删除旧字段,另一个用于更改新字段。
首先删除 dealbase.categoria 并创建一个迁移,然后将 dealbase.categoria-tmp 重命名为 dealbase.categoria 并创建另一个迁移。
这将删除第一个字段,然后将 tmp 字段更改为正确的名称。
如果您在此模型中没有任何数据,只需评论该模型,然后 运行 manage.py makemigrations
并迁移。然后把错误的字段删掉,注释代码也删掉,使makemigrations
和migrate
。这在 Django 2 中也有效。
我需要将模型字段的关系从 ForeignKey 更改为 ManyToManyField。这带有数据迁移,以更新预先存在的数据。
以下为原模型(models.py):
class DealBase(models.Model):
[...]
categoria = models.ForeignKey('Categoria')
[...]
)
我需要模型字段 'categoria' 与应用 'deal' 中的模型 'Categoria' 建立多对多关系 'deal'。
我做了什么:
在 DealBase
中创建一个新字段 'categoria_tmp'class DealBase(models.Model): categoria = models.ForeignKey('Categoria') categoria_tmp = models.ManyToManyField('Categoria',related_name='categoria-temp')
进行架构迁移
python manage.py makemigrations
编辑 migrationfile.py 将数据从 categoria 迁移到 categoria-tmp
def copy_deal_to_dealtmp(apps, schema_editor): DealBase = apps.get_model('deal', 'DealBase') for deal in DealBase.objects.all(): deal.categoria_tmp.add(deal.categoria) deal.save() class Migration(migrations.Migration): dependencies = [ ('deal', '0017_dealbase_indirizzo'), ] operations = [ migrations.AddField( model_name='dealbase', name='categoria_tmp', field=models.ManyToManyField(related_name='categoria-temp', to='deal.Categoria'), preserve_default=True, ), migrations.RunPython( copy_deal_to_dealtmp ) ]
进行数据迁移
python manage.py migrate
最后我需要删除列 'dealbase.categoria' 并将列 'dealbase.categoria-tmp' 重命名为 'dealbase.categoria'
我卡在了第 5 步。
有人能帮帮我吗?我在网上找不到答案,我使用的是 Django 1.8。
谢谢!
试试这个,可能对你有帮助。
第 1 步和你一样
python manage.py makemigrations && python manage.py migrate
打开
shell
for i in DealBase.objects.all() i.categoria_tmp.add(i.categoria)
删除您的字段
categoria
python manage.py makemigrations && python manage.py migrate
添加字段
categoria = models.ManyToManyField('Categoria',related_name='categoria-temp')
然后
python manage.py makemigrations && python manage.py migrate
打开
shell
for i in DealBase.objects.all(): for j in i.categoria_tmp.all(): i.categoria.add(j)
删除字段
categoria_tmp
python manage.py makemigrations && python manage.py migrate
您只需创建两个额外的迁移:一个用于删除旧字段,另一个用于更改新字段。
首先删除 dealbase.categoria 并创建一个迁移,然后将 dealbase.categoria-tmp 重命名为 dealbase.categoria 并创建另一个迁移。
这将删除第一个字段,然后将 tmp 字段更改为正确的名称。
如果您在此模型中没有任何数据,只需评论该模型,然后 运行 manage.py makemigrations
并迁移。然后把错误的字段删掉,注释代码也删掉,使makemigrations
和migrate
。这在 Django 2 中也有效。