django rest框架角色过滤器
djangorestframework-role-filters的Python项目详细描述
如何安装
pip install djangorestframework-role-filters
我为什么写这个项目?
我希望在代码中没有多个ifs的情况下轻松处理角色
如何使用
使用角色定义创建role_filters.py
fromrest_framework_role_filters.role_filtersimportRoleFilterfrom.serializersimportPostSerializerForUserclassAdminRoleFilter(RoleFilter):role_id='admin'classUserRoleFilter(RoleFilter):role_id='user'defget_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']defget_queryset(self,request,view,queryset):queryset=queryset.filter(user=request.user)returnquerysetdefget_serializer_class(self,request,view):returnPostSerializerForUserdefget_serializer(self,request,view,serializer_class,*args,**kwargs):fields=('body','created_at','id','serializer_name','title','updated_at','user',)returnserializer_class(*args,fields=fields,**kwargs)
创建视图集并重写get-role-id方法
fromrest_framework_role_filters.role_filtersimportRoleFilterGroupfromrest_framework_role_filters.viewsetsimportRoleFilterModelViewSetfrom.modelsimportPostfrom.role_filtersimportAdminRoleFilter,UserRoleFilterfrom.serializersimportPostSerializerclassPostViewSet(RoleFilterModelViewSet):role_filter_group=RoleFilterGroup(role_filters=[AdminRoleFilter(),UserRoleFilter()])queryset=Post.objects.all()serializer_class=PostSerializerdefget_role_id(self,request):returnrequest.user.role.role_iddefperform_create(self,serializer):serializer.save(user=self.request.user)
如果角色id为“admin”:
- 允许所有操作
- 默认的queryset被返回-
Post.objects.all()
- 使用默认的
serializer_class
-PostSerializer
- 使用默认的viewset
get_serializer
方法
如果角色id是“user”:
- 只允许“创建”、“列表”、“检索”、“更新”、“部分更新”操作
- queryset由用户过滤
- 使用
serializer_class=PostSerializerForUser
- 使用
fields
kwargs初始化序列化程序(例如,对于修改的序列化程序,如中所述 DRF: Dynamically modifying fields页)
检查testapp example代码实现。