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

时间:2010-11-07 18:26:32

标签: django django-south

我遇到了评论者提出的同一问题: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

显示架构符合预期。

对于如何解决这个问题的任何想法都表示赞赏!

3 个答案:

答案 0 :(得分:32)

最简单的方法是从头开始迁移。

删除您尝试修复的应用的所有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

答案 1 :(得分:5)

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

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)

运行南schemamigration时会出错:

DatabaseError: no such column: myappmodel_fkmodel.new_field

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

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

答案 2 :(得分:0)

对于初学者或学习者,如果你卡在这里并且不介意数据丢失(所有),那么只需删除 db.sqlit3 文件并重新运行服务器,它应该重置 sqlite

相关问题