由权限比较复杂, 部门间,科室间的数据要相互不可见,
光查询权限就有, 查所有部门,只能查某部门,只查询部门里的某科室,只查看某个项目,,
我现在是思路是把 权限 嵌入到 filter参数中,可以用,但感觉很Low
希望有经验的朋友 给个好的建议或方法
class ProjectView(APIView):
throttle_classes = []
def get(self,request):
print('get++++++++++++++++++get+++++++:')
# 过滤参数
filter_list = {}
# 获取用户权限.从user 表中 获取用户的各项权限
user_type = request.user.user_type # 用户类型
permission_query = request.user.permission_query # 查询部门权限
permission_content = request.user.permission_content # 内容权限
# 查询权限-----部门过滤-------------------------------------------
branch = re.match(r"([^/]*)/?([^/]*)?", permission_query[0]['label']) # permission_query数据格式 [{label:'部门名/科室名'}] 或 [{label:'部门名'}]
if branch.group(1) != '所有部门':
# 假如不是所有部门, 就增加部门或科室名称 做为 查找条件,
if branch.group(1) : filter_list['branch_name'] = branch.group(1)
if branch.group(2) : filter_list['department_name'] = branch.group(2)
# 内容权限 (名称过滤)-------------------------------------------
if permission_content:
project_name = request.query_params.get('project_name')
# 当用户设定了查询条件, 且包含在权限内,使用用户的查询条件
if project_name and project_name.find(permission_content) != -1:
filter_list['project_name__contains'] = project_name
# 否则使用内容权限的做为查询条件
else:
filter_list['project_name__contains'] = permission_content
# 不确定用户还有什么查询条件, 尝试获取一遍,这里很low
serial_number = request.query_params.get("serial_number") #编号
orderdate_gte = request.query_params.get("order_date_gte") # 日期范围
orderdate_lte = request.query_params.get("order_date_lte") # 日期范围
client_number = request.query_params.get('client_number') # 客户编号
is_active = request.query_params.get('is_active') # 激活状态
category_name = request.query_params.get('category_name') # 一级分类
# 假如有下面的 查询条件,就加入 过滤参数
if is_active == 'true':
filter_list['is_active'] = True
elif is_active == 'false':
filter_list['is_active'] = False
if serial_number: filter_list['serial_number'] = serial_number
else:
if orderdate_gte and orderdate_lte:
filter_list['order_date__range'] = [orderdate_gte, orderdate_lte]
elif orderdate_gte:
filter_list['order_date'] = orderdate_gte
elif orderdate_lte:
filter_list['order_date'] = orderdate_lte
if client_number: filter_list['client_number'] = client_number
if category_name: filter_list['category_name'] = category_name
query_list = ProjectInfo.objects.filter(**filter_list)
serializer = ProjectSerializer(instance = query_list, many= True)
return Response(serializer.data, status=status.HTTP_200_OK)
**我也曾尝试把权限放在 session 里,但可能存在漏洞,session可以在Html中改写
Django - DRF - BasePermission 权限组件 好象只能针对某个 视图函数。
**