Django中如何将group by(values)查询结果转为JSON并解决AttributeError报错
错误原因
- 调用Django ORM的
values()方法执行分组查询后,返回的结果集每一项都是dict类型,而非ORM模型实例,不支持使用.语法访问属性,只能通过字典的键索引['key']取值 - 代码中已经通过
Room.objects.values(...)拿到了字典结果集,循环时重复调用.values()属于冗余操作,可直接遍历lists
修复后的代码
from django.http import JsonResponse from django.db.models import Count def load_cate(request): lists = Room.objects.values('f_type','room_type', 'beds', 'balcon').annotate(total=Count('pk')).order_by('-total') data = [] for i in lists: item = { 'wc_type': i['f_type'], 'room_type': i['room_type'], 'beds': i['beds'], 'balcon': i['balcon'], 'total': i['total'] } data.append(item) return JsonResponse({'success':True,'data':data})
简化写法
如果不需要修改返回字段的键名,可省去手动循环拼接的步骤,直接把结果集转成列表返回即可:
def load_cate(request): lists = Room.objects.values('f_type','room_type', 'beds', 'balcon').annotate(total=Count('pk')).order_by('-total') return JsonResponse({'success':True,'data': list(lists)})
如果需要保留f_type转wc_type的键名替换逻辑,也可以用列表推导式简化代码:
def load_cate(request): lists = Room.objects.values('f_type','room_type', 'beds', 'balcon').annotate(total=Count('pk')).order_by('-total') data = [{'wc_type': item['f_type'], **{k:v for k,v in item.items() if k != 'f_type'}} for item in lists] return JsonResponse({'success':True,'data': data})
内容的提问来源于stack exchange,提问作者artiest
相关产品推荐
相关产品推荐

