代码之家  ›  专栏  ›  技术社区  ›  Arti

Django rerun迁移操作

  •  3
  • Arti  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  3
  •   solarissmoke    7 年前

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

    此迁移所依赖的上一个迁移是 0021_auto_20180412_1215 ,因此您可以通过以下操作回滚到该状态:

    manage.py migrate 0021
    

    当你跑步时 manage.py migrate 它将再次应用此新迁移。

    documentation :

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