django query查询中 objects.values() vs objects.values_list()

本文详细介绍了Django ORM中QuerySet的两种方法:values()和values_list()。values()方法返回包含字典的QuerySet,而values_list()则返回包含元组的QuerySet。若values_list()用于单个字段并设置flat=True,将直接返回单个值的QuerySet。了解这些方法有助于更高效地进行数据检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

values()方法返回包含字典的QuerySet:
<QuerySet [{‘comment’: 1}, {‘comment’: 2}]>

该values_list()方法返回一个包含元组的QuerySet:
<QuerySet [(1,), (2,)]>
如果你使用values_list()单个字段,则可以使用flat=True返回单个值的QuerySet而不是1个元组:
<QuerySet [1, 2]>

我创建了一个django drf项目,里面封装了一些函数,和规范,函数是class SearchableListModelMixinUp(viewsets.ModelViewSet): time_range_fields = [] def list(self, request, *args, **kwargs): query_params = request.query_params serializer_fields = set(self.get_serializer().fields.keys()) query = Q() # 普通字段模糊搜索(排除时间范围字段) for field, value in query_params.items(): if field in serializer_fields and field not in self.time_range_fields and value: query.add(Q(**{f'{field}__icontains': value}), Q.AND) # 时间范围过滤 for time_field in self.time_range_fields: time_values = query_params.getlist(f'{time_field}[]') if time_values and len(time_values) == 2: start_date = parse_datetime(time_values[0]) end_date = parse_datetime(time_values[1]) if start_date and end_date: start_date = make_aware(start_date) end_date = make_aware(end_date) query.add(Q(**{f'{time_field}__range': (start_date, end_date)}), Q.AND) # 查询和排序 queryset = self.get_queryset().filter(query).order_by('id') # 默认按 ID 排序 page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) 创建接口规范是class PermissionViewSet(viewsets.ModelViewSet): queryset = Permission.objects.all() serializer_class = PermissionSerializer pagination_class = None # 禁用分页器 # permission_classes = [permissions.IsAdminUser] 或者class UserMenuView(APIView): authentication_classes = [JWTAuthentication] permission_classes = [IsAuthenticated] def get(self, request): user = request.user # 获取用户的角色 roles = UserRole.objects.filter(user=user).values_list('role', flat=True) # 获取用户的角色名称 roles_names = UserRole.objects.filter(user=user).select_related('role').values_list('role__name', flat=True) # 将查询结果转换为列表 roles_list = list(roles_names) # 获取这些角色对应的权限 permissions = RolePermission.objects.filter(role__in=roles).values( 'permission__id', 'permission__name', 'permission__codename', 'permission__parent_id', 'role__name' # 添加 parent_id ).distinct() return Response({ 'roles': roles_list, 'menu': list(permissions) }) 写个规范文档
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值