3

我正在运行南迁移python manage.py syncdb; python manage.py migrate --all,在新数据库上运行时会中断。但是,如果你运行它两次,它就会正常运行!在第一次尝试时,我得到

DoesNotExist: ContentType matching query does not exist. Lookup parameters were {'model': 'mymodel', 'app_label': 'myapp'}

失败后,我进入数据库select * from django_content_type,但果然有

13 | my model     | myapp      | mymodel  

然后我运行迁移python manage.py syncdb; python manage.py migrate --all,它可以工作!

那么,我是如何设法进行仅第二次有效的迁移呢?顺便说一句,这是一个将适当的组放入管理应用程序的数据迁移。迁移中的以下方法正在破坏它:

@staticmethod
def create_admin_group(orm, model_name, group_name):
    model_type = orm['contenttypes.ContentType'].objects.get(app_label='myapp', model=model_name.lower())
    permissions = orm['auth.Permission'].objects.filter(content_type=model_type)
    group = orm['auth.Group']()
    group.name = group_name
    group.save()
    group.permissions = permissions
    group.save()

(迁移文件来自一个现有的工作项目,这意味着很久以前我已经运行了 schemamigration --initial。我只是试图将数据库模式和初始数据复制到一个新的数据库中。)

4

3 回答 3

3

原来这是南方的一个错误。

http://south.aeracode.org/ticket/1281

于 2013-07-18T14:31:31.693 回答
1

当然它会是这样的,你还没有进行任何初始架构迁移。正确的方法是这样的:

  1. 首先注册您的 django 应用程序south。所以像:
    python manage.py schemamigration --initial <app_name>
  2. 然后你跑manage.py syncdb
  3. 在此之后,您migrate就这样运行python manage.py migrate <apps>,请注意,简单地运行migrate只会迁移您所有注册的应用程序。我倾向于这样做。
  4. 如果您更改模型以更改架构,那么您可以简单地使用:
    manage.py schemamigration --auto

你提到的问题是这个。一旦你跑syncdb了,你已经得到了一张板条箱,南方与此无关。因此,您正在做的是查询没有迁移控制 (iirc) 的数据库。

于 2013-07-17T18:04:00.807 回答
1

第一次发布是一种不好的做法python manage.py syncdb; python manage.py migrate --all。首先,我不会太相信--all选项。它可能包括 Django 的官方库,你当然不希望这样,即使它们中没有什么要迁移的。我宁愿路过python manage.py migrate <app_name1> <app_name2> ...

但是对于 South 来说,South 的使用方式是:

  1. 创建应用
  2. 为它创建一个迁移python manage.py schemamigration --initial <app>
  3. 转换到南方和现有的迁移与python manage.py convert_to_south <app> --auto
  4. 对应用程序进行一些修改,然后python manage.py migrate <app>

您的方法实际上可能有效,但请考虑到,当您这样migrate --all做时,您无法控制应用迁移的顺序,并且python manage.py syncdb无法确保contentType您的访问在当时是可用的 (myapp, mymodel)。

该错误仅第一次出现,因为迁移实际上可能只应用了一次。并按照已应用的方式保存在south_migrationhistory表中,因此当您再次发出命令时,它会忽略它。

我的建议是,在syncdb命令之后首先迁移目标应用程序。如果这不起作用或事情变得混乱,试试这个:

  1. 注释中的'south',INSTALLED_APPS
  2. 问题python manage.py syncdb
  3. 从行#'south',中删除评论INSTALLED_APPS
  4. 发出最后的命令python manage.py migrate --all

祝你好运,希望这会有帮助!

于 2013-07-17T21:12:57.057 回答