我正在运行南迁移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。我只是尝试将数据库模式和初始数据复制到新数据库中。)
答案 0 :(得分:3)
原来这是南方的一个错误。
答案 1 :(得分:1)
当然它会是这样的,你还没有做过任何初始架构。正确的方法是这样的:
south
注册您的django应用。如下所示:python manage.py schemamigration --initial <app_name>
。manage.py syncdb
。migrate
运行python manage.py migrate <apps>
,请注意,只需运行migrate
即可迁移所有已注册的应用。我倾向于这样做。manage.py schemamigration --auto
你提到的问题是这个。一旦你运行syncdb
,你就会得到一张桌子,南方与此无关。您正在做的是查询没有迁移控制的数据库(iirc)。
答案 2 :(得分:1)
第一次发布python manage.py syncdb; python manage.py migrate --all
是一种不好的做法。首先,我对--all
选项不太信任。它可能包括Django的官方库,你当然不希望这样,即使没有任何东西要迁移。我宁愿去python manage.py migrate <app_name1> <app_name2> ...
但对于南方所关注的问题,使用南方的方式是:
python manage.py schemamigration --initial <app>
python manage.py convert_to_south <app> --auto
python manage.py migrate <app>
您的方法可能确实有效,但考虑到当您执行migrate --all
时,您无法控制所应用的迁移顺序,并且python manage.py syncdb
无法保证contentType
您的方法访问是(myapp,mymodel)当时可用。
错误仅在第一次出现,因为迁移实际上可能只应用一次。并且已经应用了south_migrationhistory
表中的保存,因此当您再次发出命令时,它会忽略它。
我的建议是,在syncdb
命令之后首先迁移目标应用程序。如果这不起作用或事情变得混乱,试试这个:
'south',
INSTALLED_APPS
行
python manage.py syncdb
#'south',
INSTALLED_APPS
行删除评论
python manage.py migrate --all