跳转到主要内容

django-rest-framework-role-filters

项目描述

https://github.com/allisson/django-rest-framework-role-filters/workflows/tests/badge.svg https://img.shields.io/pypi/v/djangorestframework-role-filters.svg https://img.shields.io/github/license/allisson/django-rest-framework-role-filters.svg https://img.shields.io/pypi/pyversions/djangorestframework-role-filters.svg

如何安装

pip install djangorestframework-role-filters

为什么我要写这个项目?

我想在不使用代码中多个if的情况下轻松地处理角色

如何使用

创建包含角色定义的role_filters.py

from rest_framework_role_filters.role_filters import RoleFilter

from .serializers import PostSerializerForUser


class AdminRoleFilter(RoleFilter):
    role_id = 'admin'


class UserRoleFilter(RoleFilter):
    role_id = 'user'

    def get_allowed_actions(self, request, view, obj=None):
        # This example returns same list both for "global permissions" check,
        # and for "object" permissions, but different list may be returned
        # if `obj` argument is not None, and this list will be used to check
        # if action is allowed during call to `ViewSet.check_object_permissions`
        return ['create', 'list', 'retrieve', 'update', 'partial_update']

    def get_queryset(self, request, view, queryset):
        queryset = queryset.filter(user=request.user)
        return queryset

    def get_serializer_class(self, request, view):
        return PostSerializerForUser

    def get_serializer(self, request, view, serializer_class, *args, **kwargs):
        fields = (
            'body',
            'created_at',
            'id',
            'serializer_name',
            'title',
            'updated_at',
            'user',
        )
        return serializer_class(*args, fields=fields, **kwargs)

创建视图集并重写get_role_id方法

from rest_framework_role_filters.viewsets import RoleFilterModelViewSet

from .models import Post
from .role_filters import AdminRoleFilter, UserRoleFilter
from .serializers import PostSerializer


class PostViewSet(RoleFilterModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    role_filter_classes = [AdminRoleFilter, UserRoleFilter]

    def get_role_id(self, request):
        return request.user.role.role_id

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

如果role_id是‘admin’

  • 允许所有操作

  • 返回默认查询集 - Post.objects.all()

  • 使用默认的serializer_class - PostSerializer

  • 使用默认的视图集get_serializer方法

如果role_id是‘user’

  • 只允许操作‘create’,‘list’,‘retrieve’,‘update’,‘partial_update’

  • 查询集根据用户进行过滤

  • 使用serializer_class=PostSerializerForUser

  • 使用带有fields kwargs的序列化器初始化(例如,用于如DRF: 动态修改字段中所述修改的序列化器)

查看testapp示例代码实现。

项目详情


下载文件

下载适用于您的平台文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

djangorestframework-role-filters-1.1.0.tar.gz (6.0 kB 查看哈希值)

上传时间

构建分发

djangorestframework_role_filters-1.1.0-py3-none-any.whl (5.8 kB 查看哈希值)

上传时间 Python 3

支持