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表。@马克:伟大的发现,让你觉得我的答案应该被否决。谢谢你的回答;我认为这将有助于创建第一次迁移的人,但这不是我问题的正确答案,我不希望人们被误导。很抱歉