django - 使用自定义用户类迁移到 django-guardian 权限

标签 django django-guardian

我正在尝试迁移我的模型以使用 Guardian 权限。此时我有:

class Data(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    class Meta:
        permissions = (
            ('view', 'View'),
            ('edit', 'Edit'),
            ('owner', 'Owner'),
        )

我创建了一个添加了新权限的迁移,并且在自定义迁移中我尝试分配如下权限:

def assignDataPermissions(apps, schema_editor):
    Data = apps.get_model('api', 'Data')
    for data in Data.objects.all():
        assign_perm('api.owner', data.user, data)


class Migration(migrations.Migration):
    dependencies = [
        ('api', '0169_auto_20180304_1619'),
    ]

    operations = [
        migrations.RunPython(assignDataPermissions)
    ]

此操作失败 guardian.exceptions.NotUserNorGroup:需要 User/AnonymousUser 或 Group 实例(获取 EmailUser 对象)

是否有更好/正确的方式迁移到 Guardian?如果没有,我如何让它看到我的自定义用户类?

最佳答案

我最终使用了更高级别的解决方法。 在迁移内部,data.user 实际上是 __fake.EmailUser 的对象,而 get_user_model() 返回 custom_user.models.EmailUser 。结果,Guardian 未能检查 isinstance(identity, get_user_model())

我的解决方法(hack?)是从与 data.user 对应的数据库中显式获取 EmailUser 对象。就像这样:

def assignDataPermissions(apps, schema_editor):
    Data = apps.get_model('api', 'Data')
    User = get_user_model()
    for data in Data.objects.all():
        user = User.objects.get(id=data.user_id)
        assign_perm('api.owner', user, data)

关于django - 使用自定义用户类迁移到 django-guardian 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49100963/

相关文章:

python - 使用 django-rest-framework 设置对象级权限

django - 防止 Django 从表单集中保存特定表单

python - 如何过滤大于或为空?

python - process_request() 恰好需要 2 个参数(给定 1 个) - Django Basic HTTP Auth Decorator

Django模板 - 我如何同时迭代两个字典

Python Django(守护者): editing data depending on an m2m-field in my model

django - 如何在 Django Guardian 中为用户定义默认权限?

django - 为什么 django-guardian 的 allocate_perm 给我一个DoesNotExist 错误?

django-rest-framework - 使用 DjangoObjectPermissionsFilter 使用 django-guardian 过滤用户的对象

css - 在引导组件上覆盖样式时遇到问题