DRF多对象权限配置问题:仅账户所有者可查看对应数据
解决DRF中账户所有者权限校验问题
步骤1:自定义权限类
在你的app目录下新建permissions.py文件,添加以下自定义权限类,用于校验当前登录用户是否是目标账户的所有者:
from rest_framework import permissions class IsAccountOwner(permissions.BasePermission): def has_permission(self, request, view): account_id = view.kwargs.get('account_id') if not account_id: return False # 校验当前用户是否已登录,且是该账户的所有者 return request.user.is_authenticated and request.user.accounts_set.filter(id=account_id).exists()
步骤2:修改视图配置权限
调整ProfileView代码,指定使用自定义权限类,同时优化视图逻辑(利用ListAPIView的内置方法简化代码):
from rest_framework.generics import ListAPIView from rest_framework import status from rest_framework.response import Response from .models import Sites from .serializers import SitesSerializer from .permissions import IsAccountOwner class ProfileView(ListAPIView): permission_classes = [IsAccountOwner] # 绑定自定义权限 serializer_class = SitesSerializer def get_queryset(self): # 根据URL参数筛选对应账户的站点 account_id = self.kwargs.get('account_id') return Sites.objects.filter(account_id=account_id) # 若需自定义响应逻辑,可保留以下代码(可选) # def list(self, request, *args, **kwargs): # self.check_permissions(request) # queryset = self.get_queryset() # serializer = self.get_serializer(queryset, many=True) # return Response(serializer.data, status=status.HTTP_200_OK)
关键补充说明
- 确保URL配置包含
account_id参数,示例:path('accounts/<int:account_id>/', ProfileView.as_view(), name='profile-view') - 代码中
request.user.accounts_set是Django外键反向关联的默认名称,若Accounts模型的user字段设置了related_name,需替换为对应名称。 - 若
Accounts的user字段允许为空(null=True),可在权限类中添加额外逻辑,决定这类无所有者的账户是否允许访问。
内容的提问来源于stack exchange,提问作者kurōzuappu
相关产品推荐
相关产品推荐

