您的位置:首页 > 汽车 > 时评 > 中国最好的建筑设计公司_开发一个app的步骤_网络seo外包_sq网站推广

中国最好的建筑设计公司_开发一个app的步骤_网络seo外包_sq网站推广

2025/4/28 3:26:35 来源:https://blog.csdn.net/carrousel0516/article/details/147461223  浏览:    关键词:中国最好的建筑设计公司_开发一个app的步骤_网络seo外包_sq网站推广
中国最好的建筑设计公司_开发一个app的步骤_网络seo外包_sq网站推广

在 Django DRF 中使用 ModelViewSet 时,若需实现用户仅能查看和操作自己的数据详情,同时允许所有认证用户访问列表,需结合权限类和动态权限分配。以下是具体步骤:

1. 自定义对象权限类

创建一个 IsOwner 权限类,检查请求用户是否为对象所有者:

python
from rest_framework import permissionsclass IsOwner(permissions.BasePermission):def has_object_permission(self, request, view, obj):# 确保只有所有者可以执行对象级别的操作(如详情、更新、删除)return obj.owner == request.user
### 2. 在 ModelViewSet 中动态分配权限

覆盖 get_permissions 方法,根据不同操作应用不同权限:

python
from rest_framework import viewsets, permissions
from .models import MyModel
from .serializers import MyModelSerializerclass MyModelViewSet(viewsets.ModelViewSet):queryset = MyModel.objects.all()serializer_class = MyModelSerializerdef get_permissions(self):# 针对列表和创建操作,仅需用户认证if self.action in ['list', 'create']:permission_classes = [permissions.IsAuthenticated]else:# 针对详情、更新、删除,需认证且是所有者permission_classes = [permissions.IsAuthenticated, IsOwner]return [permission() for permission in permission_classes]

3. 过滤列表数据(推荐)

通常更安全的做法是过滤列表仅显示用户自己的数据,避免信息泄露:

python
def get_queryset(self):# 确保用户只能看到自己的数据return MyModel.objects.filter(owner=self.request.user)

此时权限类只需 IsAuthenticated,因为列表和详情已通过过滤限制数据访问:

python
class MyModelViewSet(viewsets.ModelViewSet):permission_classes = [permissions.IsAuthenticated]def get_queryset(self):return MyModel.objects.filter(owner=self.request.user)

总结方案

动态权限分配:通过 get_permissions 区分列表和详情操作的权限,允许列表访问但限制详情。

数据过滤:使用 get_queryset 过滤数据,确保用户只能访问自己的条目,这是更安全的做法。

选择方案取决于需求:

允许列表显示所有数据:动态权限 + 不过滤 queryset,但需注意数据暴露。

仅显示用户数据:过滤 queryset + 简单权限,更推荐此方式以确保数据安全。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com