首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自定义用户类迁移到django-guardian权限

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

Stack Overflow用户
提问于 2018-03-05 06:02:22
回答 2查看 892关注 0票数 1

我正在尝试迁移我的模型以使用守护权限。在这一点上我有:

代码语言:javascript
复制
class Data(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    class Meta:
        permissions = (
            ('view', 'View'),
            ('edit', 'Edit'),
            ('owner', 'Owner'),
        )

我创建了一个添加了新权限的迁移,在自定义迁移中,我尝试像这样分配权限:

代码语言:javascript
复制
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 or Group instance is required (got EmailUser object)时,此操作失败。

有没有更好的/合适的方式迁移到卫报?如果没有,我如何让它看到我的自定义用户类?

EN

回答 2

Stack Overflow用户

发布于 2018-03-05 23:22:37

我最终使用了更高级别的变通方法。在迁移过程中,data.user实际上是__fake.EmailUser的对象,而get_user_model()返回custom_user.models.EmailUser。因此,卫士未能通过检查isinstance(identity, get_user_model())

我的解决方法(hack?)就是显式地从对应于data.user的数据库中获取EmailUser对象。如下所示:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2018-03-05 22:36:59

通常,在迁移中加载外部库很容易出错。

尝试一些像这样的低级别的东西:

代码语言:javascript
复制
def assignDataPermissions(apps, schema_editor):
    Data = apps.get_model('api', 'Data')
    Permission = apps.get_model('auth', 'Permission')
    owner_api = Permission.objects.get(content_type__applabel='api', codename='owner')
    UserObjectPermission = apps.get_model('guardian', 'UserObjectPermission')
    for data in Data.objects.all():
        UserObjectPermission.objects.create(permission=owner_api, user=data.user, content_object=data)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49100963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档