You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:30:04