Django重新运行迁移操作

时间:2018-04-16 03:58:08

标签: python django migration

在我的模型中,我将字段设置为唯一,并为其进行迁移。然后在生产服务器上,此迁移已崩溃,因为数据库具有重复的密钥。所以我在迁移中添加了以下代码:

def remove_duplicates(apps, schema_editor):
    Dir = apps.get_model('myapp.projects.models', 'Dir')

    for row in Dir.objects.all():
        if Dir.objects.filter(dir_url=row.dir_url).count() > 1:
            row.delete()


class Migration(migrations.Migration):

    dependencies = [
        ('projects', '0021_auto_20180412_1215'),
    ]

    operations = [
        migrations.RunPython(remove_duplicates),
        migrations.AlterField(
            model_name='dir',
            name='dir_url',
            field=models.TextField(unique=True),
        ),
    ]

但是如何测试这个代码在我的本地机器上运行?当我再次运行manage.py migrate时,我的功能没有被执行,我收到了消息:

  

正在运行迁移:无需迁移。

1 个答案:

答案 0 :(得分:1)

您可以在本地回滚迁移,然后重新应用它。

此版本所依赖的上一次迁移是0021_auto_20180412_1215,因此您可以使用以下命令回滚到该状态:

manage.py migrate 0021

然后再次运行manage.py migrate时,它将重新应用此新迁移。

来自documentation

  

migrate <app_label> <migrationname>:将数据库架构置于应用命名迁移的状态,但不会应用同一应用中的后续迁移。如果您之前已迁移过指定的迁移,则可能涉及取消应用迁移。