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

时间:2015-07-22 13:55:12

标签: python django django-migrations

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

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

class DealBase(models.Model):

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

    )

我需要模型字段' categoria'与模特'分类'建立多种关系。在app' deal'。

我做了什么:

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

    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'

  6. 我被困在第5步。

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

    谢谢!

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:0)

试试这个,可以帮到你。

  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
    

答案 2 :(得分:0)

如果该模型中没有任何数据,只需评论该模型,然后运行nth-value并进行迁移。然后删除错误的字段并删除注释代码,并分别创建manage.py makemigrationsmakemigrations。这也适用于Django 2。