Python Django南部移民第一次并不奏效
我正在运行一个南方迁移Python Django南部移民第一次并不奏效,python,django,django-south,Python,Django,Django South,我正在运行一个南方迁移python manage.py syncdb;python manage.py migrate——在新数据库上运行时中断的所有。然而,如果你运行两次,它会通过罚款!在第一次尝试中,我得到了 DoesNotExist: ContentType matching query does not exist. Lookup parameters were {'model': 'mymodel', 'app_label': 'myapp'} 失败后,我进入数据库从django\u
python manage.py syncdb;python manage.py migrate——在新数据库上运行时中断的所有
。然而,如果你运行两次,它会通过罚款!在第一次尝试中,我得到了
DoesNotExist: ContentType matching query does not exist. Lookup parameters were {'model': 'mymodel', 'app_label': 'myapp'}
失败后,我进入数据库从django\u content\u type中选择*
13 | my model | myapp | mymodel
然后运行迁移python manage.py syncdb;python manage.py migrate——全部
,它可以工作
那么,我是如何做到只在第二次迁移时才起作用的呢?顺便说一句,这是一个数据迁移,它将适当的组放入管理应用程序。迁移中的以下方法正在破坏它:
@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。我只是试图将数据库模式和初始数据复制到一个新的数据库上。)当然是这样的,您还没有进行任何初始的schemamigration。正确的方法如下:
首先向south
注册您的django应用程序。比如:
python manage.py schemamigration——initial
然后运行manage.py syncdb
在此之后,您可以像运行python manage.py migrate一样运行migrate
,请注意,只需运行migrate
即可迁移所有已注册的应用程序。我倾向于这样做
如果您通过更改模型来更改模式,那么只需使用:
manage.py schemamigration--auto
你提到的问题是这个。一旦你运行了syncdb
,你已经得到了一张装箱的桌子,南方与此无关。因此,您要做的是查询一个没有迁移控制(iirc)的数据库。发出python manage.py syncdb;python manage.py首次迁移--all
。首先,我不太相信--all
选项。它可能包括Django的官方库,您当然不希望这样,即使其中没有任何可移植的内容。我宁愿选择python manage.py migrate…
但就南方而言,利用南方的方式是:
创建一个应用程序
使用python manage.py模式迁移--initial为其创建迁移
使用python manage.py Convert_to_south--auto转换到南方并退出迁移
对应用程序进行一些修改,然后迁移python manage.py
您的方法实际上可能有效,但要考虑到,当您进行migrate时--all
您无法控制应用的迁移顺序,并且python manage.py syncdb
无法确保contentType
您的访问(myapp,mymodel)在当时可用
错误仅第一次出现,因为迁移可能实际应用了一次。并在south\u migrationhistory
表中按已应用的方式保存,因此当您再次发出该命令时,它将忽略该命令
我的建议是,在执行syncdb
命令之后,首先迁移目标应用程序。如果这不起作用或事情变得一团糟,请尝试以下方法:
注释已安装的应用程序中的'south',
问题python manage.py syncdb
从已安装的应用程序中的#“south”行中删除注释
发出最后一个命令python manage.py migrate--all
祝你好运,希望这有帮助 原来这是南方的一只虫子
我已经有了一些,我相信这是因为当它第一次尝试运行迁移时,模型还没有运行;尚未创建,并在该位失败后创建。下一次,因为模型在那里,它运行得很好,所以这在南方被认为是一个bug吗?我希望迁移将按顺序运行。我试着按照你说的做,但没有成功。在第2步,它失败了:DatabaseError:关系“south_migrationhistory”不存在。我现在意识到我可能没有提供足够的信息。我已经运行了schemamigration——初始值。我只是想在一台新服务器上部署一个有效的迁移历史记录。@马克:我的错,在第2步之前执行第3步。如果是这样的话,我一直按照这个顺序运行命令,但仍然失败。@马克:好的,我很快就会对此进行屏幕广播。所以,我会在可能的时候更新这个。同时检查一下:迁移失败的原因不是因为--all标志,也不是因为south_migrationhistory表中的错误。这是因为South有一个bug,不能正确处理contenttypes表。@马克:伟大的发现,让你觉得我的答案应该被否决。谢谢你的回答;我认为这将有助于创建第一次迁移的人,但这不是我问题的正确答案,我不希望人们被误导。很抱歉