重命名应用程序后进行迁移时出现Django错误

时间:2016-02-03 20:21:54

标签: python django

我正在研究Django项目,我遇到了架构中的错误。

我正在尝试在自己的包中设置模型。但是,我的应用程序一直给我错误。

一切顺利,直到我将模型移动到他们自己的包中并为每个类创建了一个文件。

现在每当我尝试运行makemigrations时,我都会收到此错误:

 ValueError: Unhandled pending operations for models:
  model.state (referred to by fields: testadmin.Member.state, testadmin.Organization.state)

我将模型应用添加到了迁移命令中,它有点起作用 - python ./manage.py makemigrations models。但是,现在我有了这个新错误。由于某些原因,迁移无法识别State模型。

SystemCheckError: System check identified some issues: ERRORS:
models.Member.state: (fields.E300) Field defines a relation with model 'State', which is either not installed, or is abstract.
models.Organization.state: (fields.E300) Field defines a relation with model 'State', which is either not installed, or is abstract

1 个答案:

答案 0 :(得分:4)

您已重命名应用,但未重命名表格。

Django将模型的表名构造为<app-name>_<model-name>。通过更改应用程序的名称,您已更改了表名称。 Django现在正在寻找不存在的表。它也抱怨迁移,因为应用的迁移会记录在数据库中,并且它们会引用应用名称。

您应该create a migration manually来处理这些变化:

  1. 重命名表格。您可以使用AlterModelTable

    class Migration(migrations.Migration):
        # ...
        operations = [
            AlterModelTable('<old-app-name>_modelname', '<new-app-name>_modelname'),
            # ...
        ]
    
  2. 重命名迁移。您必须使用MigrationRecorder.Migration模型。

    def rename_migrations_forwards(apps, schema_editor):
        MigrationRecorder.Migration.objects.filter(app='<old-app-name>').update(app='<new-app-name>')
    
    def rename_migrations_reverse(apps, schema_editor):
        MigrationRecorder.Migration.objects.filter(app='<new-app-name>').update(app='<old-app-name>')
    
    class Migration(migrations.Migration):
        # ...
        operations = [
            # ...
            migrations.RunPython(
                rename_migrations_forwards,
                rename_migrations_reverse,
            ),
        ]
    
  3. 如果覆盖模型元中的db_table,则可以跳过重命名表格。但是,您无法跳过迁移重命名。