You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:42:38