首页 文章

南迁移后Django App中没有这样的列错误

提问于
浏览
18

我遇到了评论者提出的同样问题:Django South - table already exists

没有后续行动,所以我想我会发一个新问题 . 我有一个Django应用程序,我在南方管理它的迁移 . 我在模型中添加了一个字段然后运行

./manage schemamigration my_app --auto

按预期运行 . 运行

./manage migrate my_app

但是,导致错误,表明与我更改的模型关联的表已经存在 . 这导致我上面的链接问题,所以运行

./manage migrate my_app --fake

解决了表错误,但现在我收到一个Django错误,表明与新字段关联的列不存在 .

./manage sqlall my_app

显示架构符合预期 .

任何关于如何补救这一点的想法都表示赞赏!

2 回答

  • 5

    可能最简单的方法是从头开始迁移 .

    删除您尝试修复的应用的所有 migrations/* 文件 . 将 models.py 恢复到数据库中当前的状态(借助版本控制工具,或只注释掉新字段) . 然后初始化迁移:

    manage.py migrate my_app --delete-ghost-migrations
    manage.py schemamigration my_app --init
    manage.py migrate my_app --fake
    

    这将创建迁移当前数据库结构的记录 .

    现在将您的更改添加到 models.py ,现在南方将更改内容:

    manage.py schemamigration my_app --auto
    manage.py migrate my_app
    
  • 32

    需要注意的其他事项:如果在 ForeignKey 关系中使用 default 值,并且向该FK模型添加字段,则通常会出现此错误( DatabaseError: no such column: appname_model.fieldname ) .

    像(在你的 models.py ):

    class MyAppModel(models.Model):
        my_foreign_key = models.ForeignKey(FkModel,
                                           default=lambda: FkModel.objects.get(id=1),
                                           null=True)
    

    然后在新的迁移中,向FkModel添加一个新字段:

    class FkModel(models.Model):
        new_field = models.IntegerField('New Field Name', blank=True, null=True)
    

    运行South schemamigration 时会出错:

    DatabaseError: no such column: myappmodel_fkmodel.new_field

    您可以通过确保初始South迁移包含此默认值 lambda 函数来解决此问题,但随后在下一次迁移中删除默认值 .

    这在过去一直困扰着我 . 希望它能帮助将来的某个人 .

相关问题