Django REST API如何实现接口仅返回当前用户自己上传的所属资源
Django REST API 用户资源隔离实现方案
核心修改逻辑
你只需要对查询集添加Owner过滤规则即可满足需求,以下提供两种实现方式:
方式1:直接调整现有list方法
修改ThreeDimensionalModelViewSet中的list方法查询逻辑,仅筛选Owner为当前登录用户的模型数据:
def list(self, request): # 未登录用户返回空列表,已登录用户返回自有数据 if request.user.is_authenticated: models = ThreeDimensionalModel.objects.filter(Owner=request.user) else: models = ThreeDimensionalModel.objects.none() serializer = ThreeDimensionalModelSerializer(models, many=True) return Response(serializer.data)
方式2:重写get_queryset方法(更推荐)
该方式可以让所有基于查询集的操作(包括单条查询、修改、删除等)都自动应用过滤规则,避免后续新增接口出现越权问题,修改后的完整ViewSet代码如下:
from rest_framework import status class ThreeDimensionalModelViewSet(viewsets.ViewSet): serializer_class = ThreeDimensionalModelSerializer permission_classes = [permissions.IsAuthenticatedOrReadOnly] # 统一配置过滤后的查询集 def get_queryset(self): if self.request.user.is_authenticated: return ThreeDimensionalModel.objects.filter(Owner=self.request.user) return ThreeDimensionalModel.objects.none() def list(self, request): # 直接调用get_queryset获取过滤后的数据 serializer = ThreeDimensionalModelSerializer(self.get_queryset(), many=True) return Response(serializer.data) # 可选:新增模型时自动绑定当前用户为Owner def create(self, request): serializer = ThreeDimensionalModelSerializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save(Owner=request.user) return Response(serializer.data, status=status.HTTP_201_CREATED)
可选优化
如果你的业务不允许未登录用户访问该接口,可直接将permission_classes修改为[permissions.IsAuthenticated],未登录用户会被直接拦截返回401状态码,无需额外处理未登录场景的查询集过滤逻辑。
内容的提问来源于stack exchange,提问作者Felix D
相关产品推荐
相关产品推荐

