django - 如何让用户只获取与他们相关的对象(通过多对多关系)?

标签 django django-rest-framework django-permissions django-2.2

我有一个项目,其中有工作区,每个工作区可以有任意数量的用户。用户还可以属于多个工作区,因此它们之间存在多对多的关系。

现在,我可以创建工作区和成员资格,但我在设置权限时遇到问题,以便只有工作区成员才能看到工作区。我尝试过使用自定义对象级权限,但似乎不起作用。

工作区模型如下所示:

class Workspace(models.Model):
    name = models.CharField(max_length=100)
    users = models.ManyToManyField(User, related_name='workspaces')

View 如下所示:

class WorkspaceViewSet(viewsets.ModelViewSet):
    queryset = Workspace.objects.all().order_by('name')
    serializer_class = WorkspaceSerializer
    permission_classes = [permissions.IsAuthenticated|BelongsInWorkspace]

序列化器是这样的:

class WorkspaceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Workspace
        fields = ('name', 'users')

    def create(self, validated_data):
        instance = super(WorkspaceSerializer, self)
        instance.users.add(self.context['request'].user)
        return instance

最后,我尝试在这里使用的自定义权限:

class BelongsInWorkspace(BasePermission):
    def has_permission(self, request, view):
        return True

    def has_object_permission(self, request, view, obj):
        return obj.users.filter(pk=request.user).exists()

最佳答案

我强烈推荐django-guardian来处理这个问题。 Django-guardian 允许直接的对象级权限管理。

要解决您的问题,您所需要做的就是向工作区模型添加一个 Meta 类,您可以在其中创建自定义权限。

 class Workspace(models.Model):
    name = models.CharField(max_length=100)
    users = models.ManyToManyField(User, related_name='workspaces')

    class Meta:
        default_permissions = ('add', 'change', 'delete')
        permissions = (
                ('access_workspace', 'Access workspace'),
                )

Assign具有附加到特定工作区的权限的用户或组。

assign_perm('access_workspace', user, workspace)

#This will return True if the user has been properly assigned the permission
user.has_perm('access_workspace', workspace)

然后,要获取用户有权访问的所有工作区,您只需调用 get_objects_for_user()在你看来

queryset = get_objects_for_user(self.request.user, 'project.access_workspace')

关于django - 如何让用户只获取与他们相关的对象(通过多对多关系)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58078251/

相关文章:

python - 如何返回多个查询集对象或从 Django 中的 get_queryset 方法添加查询集结果

python - 你如何序列化 Django Rest Framework 中的用户模型

django-object-permissions 与 django-guardian 与 django-authority

django - 向用户添加自定义权限

python - 从查询集值访问 Django 模板上的外键

python - 在 django 中将 openpyxl 工作簿对象作为 HttpResponse 返回。可能吗?

php - 使用 php 和 python 框架使用相同的 MySql DB

django - 如何使用 Django REST 框架 ModelViewSet 实现 HATEOAS 风格的链接?

python - 查看调用端点?

django - 如何在一个类 View 中设置多个权限,取决于http请求