【问题标题】:South unable to create new field because field does not existSouth 无法创建新字段,因为字段不存在
【发布时间】:2013-09-03 23:27:36
【问题描述】:

我正在尝试使用 South 将新的 URLField 添加到模型中,例如:

class Document(models.Model):
    text = models.TextField()
    reference_page = models.URLField(blank=True, null=True)
    source_page = models.URLField(blank=True, null=True) # new field

但是,当我运行 python manage.py schemamigration myapp --auto 时,我得到了错误:

DatabaseError: column myapp_document.source_page does not exist
LINE 1: ...ext", "myapp_document"."reference_page", "myapp_doc...

我使用 PostgreSQL 作为我的数据库后端。我为 South 正确初始化了我的应用程序,并且已经为它运行了迁移。我已经确保我的 Django 和 South 安装是最新的。

为什么它现在会给我这个错误?

编辑:奇怪的是,如果我在数据库中手动创建列,schemamigration 调用会成功,但 migrate 调用当然会失败,直到我手动删除该列。这很奇怪。

【问题讨论】:

  • myapp 里面有迁移目录吗?

标签: python django django-south


【解决方案1】:

我已经处理这个问题几个月了。 montiniz 在对另一个答案的评论中分享的link 有一个 0 票的答案解决了我的问题!我在这里发布它是为了帮助其他人.. 建立知识社区等等。


问题: schemamigration [app] --auto 失败并抱怨缺少列(通常是针对您尝试迁移架构的新字段...)

在我的情况下,它只会在修改 Workgroup 模型(models.py Model)而不是任何其他模型时抱怨。

解决方案:在引用无法迁移的模型的 ForeignKey 关系中查找具有 default 关键字参数的另一个模型。

workgroup = models.ForeignKey('core.Workgroup', default=get_default_workgroup, null=True)

如果删除default 关键字参数,然后运行管理命令,它应该会成功。然后,只需将原始的 default 参数添加回来。

【讨论】:

  • 你的方法也对我有用。当更仔细地阅读失败的 South 尝试的错误日志时,我看到了对另一个文件的引用,该文件引用了该模型。 (在我的例子中,一行代码以动态形式查询我尝试更新的模型。)所以我还注释掉了那些动态字段,构建并应用了迁移,然后取消注释掉对新修改的引用模型。
【解决方案2】:

仔细检查您的迁移文件,特别是models。好像有人在玩弄它。如果当前迁移编号为 10,则迁移 9 及以下的 models 不得在其中列出此新字段。如果它在那里,则将其删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2011-06-13
    • 1970-01-01
    • 2018-09-28
    相关资源
    最近更新 更多