迁移应用程序中缺少 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)
现在一切正常。
我正在从 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)
现在一切正常。