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'。

我做了什么:

  1. 在 DealBase

    中创建一个新字段 'categoria_tmp'
    class DealBase(models.Model):
         categoria = models.ForeignKey('Categoria')
         categoria_tmp = models.ManyToManyField('Categoria',related_name='categoria-temp')
    
  2. 进行架构迁移

    python manage.py makemigrations

  3. 编辑 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
           )
          ]
    
  4. 进行数据迁移

    python manage.py migrate

  5. 最后我需要删除列 'dealbase.categoria' 并将列 'dealbase.categoria-tmp' 重命名为 'dealbase.categoria'

我卡在了第 5 步。

有人能帮帮我吗?我在网上找不到答案,我使用的是 Django 1.8。

谢谢!

试试这个,可能对你有帮助。

  1. 第 1 步和你一样

    python manage.py makemigrations && python manage.py migrate
    
  2. 打开shell

    for i in DealBase.objects.all()
        i.categoria_tmp.add(i.categoria)
    
  3. 删除您的字段categoria

    python manage.py makemigrations && python manage.py migrate
    
  4. 添加字段

    categoria = models.ManyToManyField('Categoria',related_name='categoria-temp')
    

    然后

    python manage.py makemigrations && python manage.py migrate
    
  5. 打开shell

    for i in DealBase.objects.all():
        for j in i.categoria_tmp.all():
            i.categoria.add(j)
    
  6. 删除字段categoria_tmp

    python manage.py makemigrations && python manage.py migrate
    

您只需创建两个额外的迁移:一个用于删除旧字段,另一个用于更改新字段。

首先删除 dealbase.categoria 并创建一个迁移,然后将 dealbase.categoria-tmp 重命名为 dealbase.categoria 并创建另一个迁移。

这将删除第一个字段,然后将 tmp 字段更改为正确的名称。

如果您在此模型中没有任何数据,只需评论该模型,然后 运行 manage.py makemigrations 并迁移。然后把错误的字段删掉,注释代码也删掉,使makemigrationsmigrate。这在 Django 2 中也有效。