【问题标题】:South not working inside custom management commandSouth 在自定义管理命令中不起作用
【发布时间】:2014-08-08 08:52:01
【问题描述】:

我有一个自定义 django 管理命令,用于初始化应用程序迁移。麻烦的是,South 没有检测到命令中的新迁移。

for app in custom_apps:
    call_command('schemamigration', app, initial=True)
    call_command('migrate', app, fake=True)

这会创建初始迁移,但不会应用它们。

? You have no migrations for the 'profile' app. You might want some.

我尝试使用convert_to_south,但它只转换列表中的第一个应用程序,然后为其余应用程序提供此错误

This application has no models; this command is for applications that already have models syncdb'd.
Make some models, and then use ./manage.py schemamigration candidates --initial instead.

如果我手动运行这些命令,它们就会起作用。

不知道发生了什么。

【问题讨论】:

  • 在运行管理命令之前是否运行了syncdb?另外,请参考这个 SO 问题:stackoverflow.com/questions/21309371/…
  • 是的,我之前跑过syncdb。那不是问题。问题是它不适用于 django shell 或管理命令。已经用两个不同的 django 项目进行了测试
  • 您是否尝试过两次运行call_command('schemamigration', app, initial=True)?有时我在运行schemamigration app --init 时遇到同样的错误,然后我重新运行该命令并且它可以工作。
  • 我也有同样的问题,你找到解决办法了吗??

标签: django django-south


【解决方案1】:

我认为您缺少 migrate 命令的参数。 See here) fake 转换您的应用的小例子。他们的命令如下所示:

./manage.py 迁移 myapp 0001 --fake

所以,你可以试试这样的:

for app in custom_apps:
    call_command('schemamigration', app, initial=True)
    call_command('migrate', 0001, fake=True)

如果您想一次转换所有应用,可以在循环之外使用此代码。

call_command('migrate', 0001, fake=True, all=True)

通常,最后一个命令应该假装为所有应用应用初始迁移。

祝你好运。

【讨论】:

  • 不需要传0001。如果不提供迁移号,南会迁移到最后一个可用的迁移,所以这不是问题。无论如何,许多第 3 方应用程序都有不止 1 次迁移,因此当假迁移它们时,传递 0001 并不是一个好主意。
  • 如果您的应用程序已经进行了迁移,那么使用 initial=True 调用 schemamigration 会达到目的,不是吗?因为 afaik,该命令仅用于第一次迁移...
  • 我的应用没有迁移功能,只是举例说明为什么不总是需要传递 0001 或应用假的最佳选择。
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 2018-06-19
  • 1970-01-01
  • 2018-01-21
  • 2023-04-05
相关资源
最近更新 更多