Django 1.8:删除/重命名数据迁移中的模型字段

use*_*892 2 python django django-migrations

我需要将模型字段的关系从ForeignKey更改为ManyToManyField.这带有数据迁移,用于更新预先存在的数据.

以下是原始模型(models.py):

class DealBase(models.Model):

    [...]
    categoria = models.ForeignKey('Categoria')
    [...]

    )
Run Code Online (Sandbox Code Playgroud)

我需要模型字段'categoria'来与应用'deal'中的模型'Categoria'建立多种关系.

我做了什么:

  1. 在DealBase中创建一个新字段'categoria_tmp'

    class DealBase(models.Model):
         categoria = models.ForeignKey('Categoria')
         categoria_tmp = models.ManyToManyField('Categoria',related_name='categoria-temp')
    
    Run Code Online (Sandbox Code Playgroud)
  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
           )
          ]
    
    Run Code Online (Sandbox Code Playgroud)
  4. 进行数据迁移

    python manage.py migrate

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

我陷入了第5步.

有人可以帮帮我吗?我在网上找不到答案,我正在使用Django 1.8.

谢谢!

Jef*_*_Hd 6

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

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

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