如何判断Django QuerySet中的角色值是否存在于指定列表中
最优实现方案(数据库层面过滤,性能最优)
直接用Django ORM的__in查询符+exists()方法,直接在数据库层面完成校验,不需要把所有角色数据加载到内存,数据量越大优势越明显:
allowed_roles = ['admin', 'customer', 'supplier', 'observer'] # 只要用户所属分组有任意一个在允许列表内,就返回True if request.user.groups.filter(name__in=allowed_roles).exists(): print('Authorised') # 视图场景下直接返回对应的视图结果 # return view_fn(request, *args, **kwargs)
方案二:已持有QuerySet实例时的实现
如果你已经提前拉取了account_roles这个QuerySet,不需要再重复请求数据库,可以用Python内置的any()函数做批量校验,它默认是短路求值,碰到第一个符合条件的元素就会终止遍历,性能有保障:
account_roles = request.user.groups.all() allowed_roles = ['admin', 'customer', 'supplier', 'observer'] # 遍历所有角色判断是否有符合条件的 if any(role.name in allowed_roles for role in account_roles): print('Authorised')
你之前的写法只取了QuerySet的第一个元素[0].name做校验,当用户的第一个角色不在允许列表、但后续角色在允许列表时,会出现校验错误,上述两种方案都会覆盖所有角色的判断,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者user8758206
相关产品推荐
相关产品推荐

