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

问题描述 投票:2回答:3

我需要将模型字段的关系从ForeignKey更改为ManyToManyField。伴随数据迁移,以更新先前存在的数据。

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

class DealBase(models.Model):

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

    )

我需要模型字段'categoria'与应用程序'deal'中的模型'Categoria'建立多对多关系。

我做了什么:

  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 migration

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

我被困在步骤5。

有人可以帮我吗?我无法在线找到答案,我正在使用Django 1.8。

谢谢!

python django django-migrations
3个回答
6
投票

您只需要创建两个其他迁移:一个删除旧字段,另一个修改新字段。

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

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


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
    

0
投票

如果您在此模型中没有任何数据,只需对该模型进行注释,然后运行manage.py makemigrations并进行迁移,然后删除错误的字段并删除注释代码,并进行“ makemigrations”和“ migrate” 。这也适用于Django 2。

© www.soinside.com 2019 - 2024. All rights reserved.