Dre*_*ins 18 django django-south
我遇到了评论者提出的同样问题:Django South - 表已经存在
没有后续行动,所以我想我会发一个新问题.我有一个Django应用程序,我在南方管理它的迁移.我在模型中添加了一个字段然后运行
./manage schemamigration my_app --auto
Run Code Online (Sandbox Code Playgroud)
按预期运行.运行
./manage migrate my_app
Run Code Online (Sandbox Code Playgroud)
但是,导致错误,表明与我更改的模型关联的表已经存在.这导致我上面的链接问题,所以运行
./manage migrate my_app --fake
Run Code Online (Sandbox Code Playgroud)
解决了表错误,但现在我收到一个Django错误,表明与新字段关联的列不存在.
./manage sqlall my_app
Run Code Online (Sandbox Code Playgroud)
显示架构符合预期.
任何关于如何补救这一点的想法都表示赞赏!
Ski*_*Ski 32
可能最简单的方法是从头开始迁移.
删除migrations/*您尝试修复的应用的所有文件.恢复models.py到目前数据库中的状态(通过版本控制工具的帮助,或只注释掉新字段).然后初始化迁移:
manage.py migrate my_app --delete-ghost-migrations
manage.py schemamigration my_app --init
manage.py migrate my_app --fake
Run Code Online (Sandbox Code Playgroud)
这将创建迁移当前数据库结构的记录.
现在添加你的更改,models.py现在南方将改变:
manage.py schemamigration my_app --auto
manage.py migrate my_app
Run Code Online (Sandbox Code Playgroud)
需要注意的其他事项: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)
Run Code Online (Sandbox Code Playgroud)
然后在新的迁移中,向FkModel添加一个新字段:
class FkModel(models.Model):
new_field = models.IntegerField('New Field Name', blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
运行南方时会出错schemamigration:
DatabaseError: no such column: myappmodel_fkmodel.new_field
您可以通过确保初始South迁移包含此默认值lambda函数来解决此问题,但随后在下一次迁移中删除默认值.
这在过去一直困扰着我.希望它能帮助将来的某个人.
| 归档时间: |
|
| 查看次数: |
7676 次 |
| 最近记录: |