预期“权限”实例,得到...权限实例?

Dmi*_*lov 6 python django django-models django-south

我尝试为自定义用户类型编写数据迁移代码,但是当我尝试应用迁移时,我得到了这个:

TypeError: 'Permission' instance expected, got <Permission: my_app | Some Text | Can add some_model>
Run Code Online (Sandbox Code Playgroud)

对我来说看起来很奇怪。那不是 Permission 实例吗?这是我的自定义用户模型:

class Employee(AbstractUser):
    middle_name = models.CharField(max_length=60, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

这是迁移中的一段代码,它引发了这个错误(我猜是这样):

for user in User.objects.all():
    employee = orm.Employee.objects.create(
    id=user.id,
    username=user.username,
    first_name=user.first_name,
    last_name=user.last_name,
    password=user.password,
    email=user.email,

    is_active=user.is_active,
    is_superuser=user.is_superuser,
    last_login=user.last_login,
    date_joined=user.date_joined,
    )
    for perm in user.user_permissions.all():
        employee.user_permissions.add(perm)
Run Code Online (Sandbox Code Playgroud)

小智 0

我使用用户模型作为

from django.contrib.auth.models import AbstractUser

class MyProjectUser(AbstractUser):
...
Run Code Online (Sandbox Code Playgroud)

我创建迁移以向某些用户组添加新权限:

# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import DataMigration
from django.db import models


permissions_codenames = (
    'can_action_1',
    ...
    'can_action_10',
)


class Migration(DataMigration):

    def forwards(self, orm):
        "Write your forwards methods here."
        permissions = orm['auth.Permission'].objects.filter(codename__in=permissions_codenames)
        for user in orm.MyProjectUser.objects.filter(groups__name__in=('GroupName1', 'GroupName2')):
            user.user_permissions.add(*permissions)

    def backwards(self, orm):
        "Write your backwards methods here."
        permissions = orm['auth.Permission'].objects.filter(codename__in=permissions_codenames)
        for user in orm.MyProjectUser.objects.filter(groups__name__in=('GroupName1', 'GroupName2')):
            user.user_permissions.remove(*permissions)

    models = {
    ...
    }

    complete_apps = ['users']
    symmetrical = True
Run Code Online (Sandbox Code Playgroud)

“users”中complete_apps = ['users']是应用程序名称,位于 MyProjectUser 类中。