我需要将模型字段的关系从ForeignKey更改为ManyToManyField。这有一个数据迁移,来更新预先存在的数据。
以下是原始模型(models.py):

class DealBase(models.Model):

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

    )

我需要模型字段“categoria”与应用程序“deal”中的模型“categoria”建立多个关系。
我所做的:
在DealBase中创建新字段“categoria\u tmp”
class DealBase(models.Model):
     categoria = models.ForeignKey('Categoria')
     categoria_tmp = models.ManyToManyField('Categoria',related_name='categoria-temp')

进行架构迁移
python manage.py生成迁移
编辑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迁移
最后,我需要删除列“dealbase.categoria”,并将列“dealbase.categoria tmp”重命名为“dealbase.categoria”
我被困在第五步。
有人能帮我吗?我在网上找不到答案,我用的是Django 1.8。
谢谢!

最佳答案

您只需要创建两个额外的迁移:一个用于删除旧字段,另一个用于更改新字段。
首先删除dealbase.categoria并创建迁移,然后将dealbase.categoria-tmp重命名为dealbase.categoria并创建另一个迁移。
这将删除第一个字段,然后将tmp字段更改为正确的名称。

10-05 23:41