Django REST Framework如何限制用户仅能更新自有内容
仅允许作者编辑自有内容的权限实现方案
你可以通过DRF(Django REST Framework)的自定义对象级权限完成需求,不需要手动重写update方法硬写逻辑,具体步骤如下:
1. 编写自定义权限类
在对应app目录下新建permissions.py,写入以下逻辑:
from rest_framework import permissions class IsBlogAuthorOrReadOnly(permissions.BasePermission): def has_object_permission(self, request, view, obj): # GET、HEAD、OPTIONS 等安全读操作直接放行 if request.method in permissions.SAFE_METHODS: return True # 写操作仅校验当前登录用户是否为博客作者 return obj.author == request.user
2. 修改ViewSet配置
直接删除你之前写的空update方法(空方法会覆盖ModelViewSet内置的更新逻辑,导致接口失效),给视图集配置权限类,同时补充创建时自动绑定作者的逻辑,修改后的views.py代码如下:
from rest_framework import viewsets from rest_framework.permissions import IsAuthenticatedOrReadOnly from .models import Blog from .serializers import BlogSerializer from .pagination import BlogPagination from .permissions import IsBlogAuthorOrReadOnly class BlogViewSet(viewsets.ModelViewSet): queryset = Blog.objects.all() serializer_class = BlogSerializer pagination_class = BlogPagination lookup_field = 'blog_slug' # 权限规则:未登录用户仅可浏览,登录用户可发布内容,仅作者可编辑/删除自己的博客 permission_classes = [IsAuthenticatedOrReadOnly, IsBlogAuthorOrReadOnly] def perform_create(self, serializer): # 创建博客时自动将当前登录用户设为作者,不需要前端传author参数 serializer.save(author=self.request.user)
补充注意点
- 你当前的Blog模型没有配置
blog_slug字段,和lookup_field = 'blog_slug'配置不匹配,会导致路由报错。可以在模型中补充slug字段,自动根据博客标题生成:from django.utils.text import slugify # 放在Blog模型字段定义区域 blog_slug = models.SlugField(max_length=200, unique=True, blank=True) # 给Blog模型增加save方法自动生成slug def save(self, *args, **kwargs): if not self.blog_slug: self.blog_slug = slugify(self.blog_title) super().save(*args, **kwargs) - 上述权限逻辑会自动覆盖所有对象级写操作,包括PUT全量更新、PATCH部分更新、DELETE删除,不需要给每个操作单独写校验。
- 如果需要调整为非作者完全不可见(私有博客场景),只需要把权限类中
SAFE_METHODS的放行逻辑删除即可。
内容的提问来源于stack exchange,提问作者boyenec
相关产品推荐
相关产品推荐

