迁移重命名模型字段ManyToMany Django 1.8

时间:2015-11-09 15:22:30

标签: python django django-models

我的情况非常相似:Django migration strategy for renaming a model and relationship fields

我需要将Foo重命名为Bar

我们有一个相同的myapp

class Foo(models.Model):
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)

但我在myotherapp的ManyToMany字段中有:

class AnotherModel(models.Model):
    foo = models.ForeignKey(Foo)
    is_awesome = models.BooleanField()

class YetAnotherModel(models.Model):
    foo = models.ManyToManyField(Foo, blank=True, null=True) # Here!
    is_ridonkulous = models.BooleanField()

我尝试重命名:

foo = models.ManyToManyField(Foo, blank=True, null=True)

IntegerField()但不起作用。我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

这就是我做的。注意:我在制作中 NOT ,因此我不必担心表格中已有的信息。如果您目前拥有需要保留在链接表中的数据, 首先备份数据 。另外,我使用的是Django 1.9,但我认为这里引用的所有内容都是1.8。

多对多关系的问题是中间表。使用RemoveField和AddField处理了这个。

模型重命名的myapp迁移可能看起来像这样:

class Migration(migrations.Migration):

    dependencies = [
        ('Foo', '0001_initial.py'),
    ]

    operations = [
        migrations.RenameModel(
            old_name='Foo',
            new_name='Bar',
        ),
    ]

接下来你将运行:

python manage.py makemigrations --empty myotherapp

然后你将把这段代码放在新的迁移中:

dependencies = [
        ('myotherapp', '0001_initial.py'),
        ('myapp', '0002_whateverthismigrationwasnamed')
    ]

    operations = [
        migrations.RemoveField(
            model_name='YetAnotherModel',
            name='Foo'
        ),
        migrations.AddField(
            model_name='YetAnotherModel',
            name='Bar',
            field=models.ManyToManyField(blank=True, null=True, to='myapp.Bar'),
        ),
    ]

确保从myapp添加重命名模型迁移作为依赖项非常重要,因此它首先运行。

现在,如果您正在制作中,您应该 NOT 使用此方法而不采取预防措施。它直接删除链接表。这来自RemoveField上的django docs

  

请记住,当颠倒时,这实际上是在模型中添加一个字段。如果字段可以为空,或者如果它具有可用于填充重新创建的列的默认值,则操作是可逆的(除了任何数据丢失,当然这是不可逆转的)。

如果您正在制作中,则需要采取措施备份数据,以便将其恢复到新表中。