【问题标题】:Django south migration with --noinput does not remove contenttypes when renaming tables重命名表时,使用 --noinput 的 Django 南迁移不会删除内容类型
【发布时间】:2013-12-11 17:14:02
【问题描述】:

我正在使用 django-south 迁移 django 项目中的数据库表。我正在重命名a previous question 中讨论的模型:

    # Renaming model from 'Foo' to 'Bar'                                                                                                                      
    db.rename_table('myapp_foo', 'myapp_bar')                                                                                                                        
    db.send_create_signal('myapp', ['Bar'])

但是,我使用 fabric 自动将我的应用程序部署到生产服务器,并且我希望迁移在没有任何用户输入的情况下运行。为此,我使用 noinput 选项运行迁移命令,如下所示

python manage.py migrate --noinput

除了send_create_signal 不会在此模式下删除陈旧的内容类型之外,这工作正常。

这是因为 django contenttype managament 命令update_contenttypes 仅在给出输入时删除过时的内容类型。

我可以直接在南迁移中复制 update_contenttypes 命令,但这似乎不是一个好的解决方案。有没有人有关于如何在不重复 django 命令的情况下触发删除内容类型的建议?

【问题讨论】:

  • 为什么要使用 --noinput 运行迁移?
  • 这是因为我想在没有人工交互的情况下部署到生产服务器。我正在使用结构脚本完全自动化地将代码库从存储库部署到服务器。为了能够做到这一点,我在这里寻找无需人工输入的解决方案。
  • 那么您可能应该只是复制命令,或者创建数据迁移并手动删除受影响的 content_types。
  • 你可能是对的。我希望有一个更优雅的解决方案。如果update_contenttypes 函数可以选择在没有输入的情况下强制更新,那将是理想的。但既然没有,似乎在迁移中明确地这样做是最好的解决方案。
  • 也许你可以用fabric而不是noinput将“y”字符作为命令的输入?

标签: django model rename user-input django-south


【解决方案1】:

根据我的经验,运行 manage.py syncdb --all 会起作用,但在涉及 South 的情况下并非总是如此。您可以尝试一下,因为它在过去对我有用,尤其是在从内容类型表中删除过时的模型时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 2021-10-04
    • 2021-09-08
    • 2015-10-12
    • 1970-01-01
    • 2014-06-22
    • 2014-12-21
    • 2015-08-25
    相关资源
    最近更新 更多