Django South Migration第一次没有工作

时间:2013-07-17 17:01:31

标签: python django django-south

我正在运行南迁移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。我只是尝试将数据库模式和初始数据复制到新数据库中。)

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

  1. 首先使用south注册您的django应用。如下所示:
    python manage.py schemamigration --initial <app_name>
  2. 然后您运行manage.py syncdb
  3. 在此之后,您按migrate运行python manage.py migrate <apps>,请注意,只需运行migrate即可迁移所有已注册的应用。我倾向于这样做。
  4. 如果您更改模型以更改架构,则只需使用:
    manage.py schemamigration --auto
  5. 你提到的问题是这个。一旦你运行syncdb,你就会得到一张桌子,南方与此无关。您正在做的是查询没有迁移控制的数据库(iirc)。

答案 2 :(得分:1)

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

但对于南方所关注的问题,使用南方的方式是:

  1. 创建应用
  2. 使用python manage.py schemamigration --initial <app>
  3. 为其创建迁移
  4. 转换为南方并使用python manage.py convert_to_south <app> --auto
  5. 进行迁移
  6. 对应用进行一些修改,然后python manage.py migrate <app>
  7. 您的方法可能确实有效,但考虑到当您执行migrate --all时,您无法控制所应用的迁移顺序,并且python manage.py syncdb无法保证contentType您的方法访问是(myapp,mymodel)当时可用。

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

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

    1. 'south',
    2. 中评论INSTALLED_APPS
    3. 问题python manage.py syncdb
    4. #'south',
    5. 中的第INSTALLED_APPS行删除评论
    6. 发出最终命令python manage.py migrate --all
    7. 祝你好运,希望这会有所帮助!