Django查询集去重或运算和distinct()方式
2019-01-06 本文已影响1人
吾星喵
Django查询集去重
使用.distinct()
# 学习该课程的用户,首先获取该课程在UserCourse对应关系,然后查询UserCourse表中的所有用户,使用distinct()去重
user_courses = UserCourse.objects.filter(course=course)
print(user_courses)
user_courses = user_courses.values('user__nick_name', 'user__username', 'user__image').distinct()
print(user_courses)
得到结果
<QuerySet [<UserCourse: admin 学习 Django入门基础>, <UserCourse: user 学习 Django入门基础>, <UserCourse: admin 学习 Django入门基础>]>
<QuerySet [{'user__nick_name': 'LR', 'user__username': 'admin', 'user__image': 'image/2018/08/admin头像.jpg'}, {'user__nick_name': 'user', 'user__username': 'user', 'user__image': 'image/default.png'}]>
使用|或运算符
- 用户和权限多对多管理
- 用户和组多对多关系
- 组和权限多对多管理
- 要得到用户的权限,需要得到自己的权限,然后得到它的所有组的权限
- 把这些权限合并去重得到用户最终的权限
# 获取用户自己的权限查询集
user_permission = user_obj.permission.all()
if user_obj.group.all():
for group in user_obj.group.all():
# 获取用户某个组的权限查询集
group_permission = group.permission.all()
# 将用户权限查询集和用户组权限查询集合并去重
user_permission = set(user_permission) | set(group_permission) # 使用或运算符
print('用户{}({})权限查询集:{}'.format(user_obj.nickname, user_obj.username, user_permission))
# 一般情况下就可以完全去重,如果发现还不行,再使用.distinct()
user_permission = user_permission.values('name', 'alias').distinct()