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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:36:01