Django REST Framework基于类视图的帖子增删改权限及序列化字段控制问题
解决基于类视图的Post更新/删除权限与字段控制问题
嘿,刚好你用的RetrieveUpdateDestroyAPIView本身就支持重写方法来定制权限和逻辑,完全不用切换到函数视图,我来一步步帮你搞定这两个问题:
问题1:限制仅帖子作者可修改/删除
我们可以通过重写类视图的check_object_permissions方法,在操作对象前验证当前用户是否是帖子的作者。这样能精准阻止非作者的修改/删除操作,甚至可以顺便控制帖子的访问权限:
# views.py 修改后的代码 from rest_framework import generics, permissions from rest_framework.exceptions import PermissionDenied from .models import Post from .serializers import PostSerializer class UpdatePostView(generics.RetrieveUpdateDestroyAPIView): permission_classes = [permissions.IsAuthenticated] serializer_class = PostSerializer queryset = Post.objects.all() lookup_field = 'id' def check_object_permissions(self, request, obj): super().check_object_permissions(request, obj) # 验证当前用户是否是帖子的作者 if obj.user != request.user: raise PermissionDenied("你只能修改或删除自己发布的帖子")
问题2:禁止更新时修改user字段
有两种常用方法实现,选一种你觉得顺手的就行:
方法1:在序列化器中标记user为只读字段
直接修改PostSerializer,把user字段设为只读,这样请求体里的user参数会被自动忽略:
# serializers.py 修改后的代码 from rest_framework import serializers from .models import Post class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = '__all__' read_only_fields = ['user'] # 添加这一行,锁定user字段为只读
方法2:在视图中重写perform_update强制锁定用户
如果需要更灵活的控制(比如确保更新时始终关联当前登录用户),可以在视图里重写perform_update方法,直接覆盖请求体中的user值:
# views.py 给UpdatePostView添加以下方法 def perform_update(self, serializer): # 更新时强制将帖子的user设为当前登录用户 serializer.save(user=self.request.user)
做完这两处修改后,你的两个问题就都解决了:非作者无法操作他人帖子,更新时也不能篡改user字段啦~
内容的提问来源于stack exchange,提问作者Sagar Yadav
相关产品推荐
相关产品推荐

