Django如何基于用户权限正确处理请求,适配不同权限的item列表查询
Django 类视图item列表权限控制的标准实现方案
标准的Django开发实践更推荐你倾向的第二种方案:仅创建一个类视图,在内部做权限判断后返回对应数据。
选择单视图方案的核心理由
- 符合资源访问的设计逻辑:
items列表是同一个业务资源,不需要为不同权限的用户拆分多个访问入口和视图代码,也避免了多视图场景下后续功能迭代需要同步修改多份代码的维护成本 - 适配Django类视图的原生设计:Django类视图的
get_queryset方法天然就是用来做查询集动态过滤的扩展点,完全不需要额外做冗余开发 - 权限逻辑更内聚:权限判断和查询集过滤逻辑放在同一个视图内,后续排查问题、修改权限规则时不需要跨多个文件查找逻辑
基础实现示例(基于通用ListView)
假设Item模型有user外键字段关联归属用户,实现代码如下:
from django.views.generic import ListView from .models import Item class ItemListView(ListView): model = Item # 其他通用配置比如分页、模板路径等统一在这里声明 def get_queryset(self): base_queryset = super().get_queryset() # 管理员/is_staff权限用户返回全量数据 if self.request.user.is_staff or self.request.user.is_superuser: return base_queryset # 普通用户仅返回归属自己的数据 return base_queryset.filter(user=self.request.user)
如果是使用Django REST Framework的API视图,逻辑完全一致,重写对应视图的get_queryset方法即可。
特殊场景下才需要拆分多视图
只有当不同权限用户查看items列表时,页面结构、返回字段、附加业务逻辑完全没有共用部分的极端场景下,才需要考虑拆分两个独立的类视图,否则都优先使用单视图方案。
内容的提问来源于stack exchange,提问作者The silent one
相关产品推荐
相关产品推荐

