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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:15:35