如何解决Django 迁移错误:不要自动创建权限和内容类型
我使用 django 1.8.7 和 python 2.7 。我有迁移问题。当我迁移我的模型时,权限和内容类型不会自动创建。 错误看起来像这样:
Traceback (most recent call last):
File "/home/mariocesar/Proyectos/Crowddeals/env/local/lib/python2.7/site-
packages/django/core/management/base.py",line 222,in run_from_argv
self.execute(*args,**options.__dict__)
File "/home/mariocesar/Proyectos/Crowddeals/env/local/lib/python2.7/site-
packages/django/core/management/base.py",line 252,in execute
output = self.handle(*args,**options) File"/home/mariocesar/Proyectos/Crowddeals/crowddeals/core/management/commands/update_pe
rmissions.py",line 29,in handle
create_permissions(app,get_models(),options.get('verbosity',0))
File "/home/mariocesar/Proyectos/Crowddeals/env/local/lib/python2.7/site-
packages/django/contrib/auth/management/__init__.py",line 74,in create_permissions
for perm in _get_all_permissions(klass._Meta,ctype):
File "/home/mariocesar/Proyectos/Crowddeals/env/local/lib/python2.7/site-
packages/django/contrib/auth/management/__init__.py",line 28,in
_get_all_permissions
_check_permission_clashing(custom,builtin,ctype)
File "/home/mariocesar/Proyectos/Crowddeals/env/local/lib/python2.7/site-
packages/django/contrib/auth/management/__init__.py",line 49,in
_check_permission_clashing
for codename,_name in custom:
ValueError: too many values to unpack
当我像这样更改迁移文件时:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib.auth.management import _get_builtin_permissions,_check_permission_clashing
from django.db import migrations,models
from django.conf import settings
def _get_all_permissions(opts,ctype):
"""
Returns (codename,name) for all permissions in the given opts.
"""
builtin = _get_builtin_permissions(opts)
custom = list(opts.permissions)
if any(isinstance(el,basestring) for el in custom):
custom = [custom]
_check_permission_clashing(custom,ctype)
return builtin + custom
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),]
operations = [
migrations.CreateModel(
name='JsonModel',fields=[
('id',models.AutoField(verbose_name='ID',serialize=False,auto_created=True,primary_key=True)),('data',models.CharField(max_length=1000000)),('generatedtime',models.DateTimeField(auto_Now_add=True,null=True)),('title',models.CharField(max_length=200,null=True,blank=True)),('type',models.IntegerField(default=0)),('user',models.ForeignKey(to=settings.AUTH_USER_MODEL)),],options={
'permissions': (('view_jsonmodel','Can view jsonmodel'),('view_jsonmodel_int','Can view jsonmodel_int')
},),]
def forwards(self,orm):
from django.contrib.auth import management
management._get_all_permissions = _get_all_permissions
并运行命令“python manage.py migrate” 这是回应:
Operations to perform:
Apply all migrations: (none)
Running migrations:
No migrations to apply.
Your models have changes that are not yet reflected in a migration,and so won't be applied.
Run 'manage.py makemigrations' to make new migrations,and then re-run 'manage.py migrate' to apply them.
Traceback (most recent call last):
File "manage.py",in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py",line 354,in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py",line 346,in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py",line 394,in run_from_argv
self.execute(*args,**cmd_options)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py",line 445,in execute
output = self.handle(*args,**options)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py",line 226,in handle
emit_post_migrate_signal(created_models,self.verbosity,self.interactive,connection.alias)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/sql.py",line 280,in emit_post_migrate_signal
using=db)
File "/usr/local/lib/python2.7/dist-packages/django/dispatch/dispatcher.py",line 189,in send
response = receiver(signal=self,sender=sender,**named)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/management/__init__.py",line 84,in create_permissions
for perm in _get_all_permissions(klass._Meta,ctype):
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/management/__init__.py",line 24,in _get_all_permissions
_check_permission_clashing(custom,ctype)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/management/__init__.py",line 47,in _check_permission_clashing
for codename,_name in custom:
感谢您的帮助。 :)
解决方法
我找到了解决方案,在其他model.py应用程序中定义自定义权限时,我的同事定义了这样的自定义权限:
class Meta:
permissions = (
('view_log','Can view log'),('view_failedloginlog','Can view failed login log'),('view_loginlog','Can view login log'),('view_loginattempt','Can view login attempt'),('view_onlineusers','Can view online users')
)
虽然,权限类型应该是 tupe;这意味着权限应该像这样定义:
class Meta:
permissions = (
('view_log','Can view online users'),)
这个“,”太重要了!!! :))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。