迁移应用程序中缺少 django 1.9 models_module

django 1.9 models_module missing in migration apps

我正在从 Django 1.8 迁移到 Django 1.9。

我有一个迁移,它添加了一个组 user,然后向该组添加了权限 django_comments.add_comment。适用于 django 1.8 的迁移如下所示

from django.contrib.contenttypes.management import update_contenttypes
from django.contrib.auth.management import create_permissions


def create_perms(apps, schema_editor):
  update_contenttypes(apps.get_app_config('django_comments'))
  create_permissions(apps.get_app_config('django_comments'))

  Group = apps.get_model('auth', 'Group')
  group = Group(name='user')
  group.save()

  commentct = ContentType.objects.get_for_model(apps.get_model('django_comments', 'comment'))

  group.permissions.add([Permission.objects.get(codename='add_comment', content_type_id=commentct)])
  group.save()


class Migration(migrations.Migration):

    dependencies = [
        ('contenttypes', '0002_remove_content_type_name'),
        ('django_comments', '0002_update_user_email_field_length')
    ]

    operations = [
        migrations.RunPython(create_perms, remove_perms)
    ]

升级到django 1.9 时,会抛出一个错误,因为找不到contenttype。这是因为当 update_contenttypes 调用没有创建必要的 content_types。该函数中有这一行 (django's source code reference)

def update_contenttypes(app_config, verbosity=2, interactive=True, using=DEFAULT_DB_ALIAS, **kwargs):
    if not app_config.models_module:
         return
    ...

这个app_config.models_module在django 1.9中是None,但在django 1.8

中是不是None

如果我用这个代码替换它

def update_contenttypes(app_config, verbosity=2, interactive=True, using=DEFAULT_DB_ALIAS, **kwargs):
    if not app_config.models_module:
         #return
         pass
    ...

然后一切正常。

问题是我不想更改 django 的核心代码。我怎样才能在 django 1.9 中完成这项工作?

好的,感谢#django IRC(用户 knbk)的帮助,我找到了一个丑陋的解决方法,但至少它有效!

改变这两行

  update_contenttypes(apps.get_app_config('django_comments'))
  create_permissions(apps.get_app_config('django_comments'))

改写这个

  app = apps.get_app_config('django_comments')
  app.models_module = app.models_module or True
  update_contenttypes(app)
  create_permissions(app)

现在一切正常。