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

如何配置Django REST Framework,让作者仅查看并编辑自己的帖子?

实现每个作者仅查看自己帖子的DRF权限方案

要实现只有作者能查看和编辑自己的帖子,我们需要同时调整权限类和视图逻辑——原来的权限类只控制了对象级的修改权限,列表视图还会默认返回所有数据,得配套修改才行:

1. 修改IsAuthorOrReadOnly权限类

原权限类对GET这类安全方法直接放行,导致任何人都能查看任意帖子。我们要把安全方法的权限也限制为仅作者可见:

from rest_framework import permissions

class IsAuthorOrReadOnly(permissions.BasePermission):
    def has_permission(self, request, view):
        # 仅登录用户能访问所有接口
        return request.user.is_authenticated

    def has_object_permission(self, request, view, obj):
        # 不管是查看还是修改,都必须是帖子的作者本人
        return obj.author == request.user

2. 调整视图类的查询范围

光改权限类还不够,列表视图默认会返回所有Task对象。我们需要重写get_queryset方法,让每个用户只能拉取自己创建的帖子:

from rest_framework import generics
from .models import Task
from .serializers import TaskSerializer
from .permissions import IsAuthorOrReadOnly

class TaskList(generics.ListCreateAPIView):
    permission_classes = (IsAuthorOrReadOnly,)
    serializer_class = TaskSerializer

    def get_queryset(self):
        # 仅返回当前登录用户创建的Task
        return Task.objects.filter(author=self.request.user)

class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (IsAuthorOrReadOnly,)
    serializer_class = TaskSerializer

    def get_queryset(self):
        # 同样限制查询集,配合权限类做双重安全校验
        return Task.objects.filter(author=self.request.user)

补充说明

  • 为什么要同时修改查询集和权限类?
    • 修改查询集是为了减少不必要的数据加载,避免把其他用户的帖子拉到内存里,提升接口性能;
    • 权限类是最后一道安全防线,防止有人通过手动构造URL访问不属于自己的帖子详情。

内容的提问来源于stack exchange,提问作者Ulan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:20:31