如何在Django视图中基于查询集的公共元素对值进行分组?

问题描述 投票:-1回答:1

我是Django新手,我需要此数据来绘制一些图表,请帮助我必须在特定结构中将我的查询集作为字典使用]

这是我的观点:

def pr1(request):
    fdate = unidecode(str(request.GET.get('fdate')))
    tdate = unidecode(str(request.GET.get('tdate')))                

    dataSource = OrderedDict()
    dataSource["dataset"] = []

    for key in Production.objects.filter(date__range=(fdate, tdate)).values('date', 'comName').annotate(total_qty=Sum('qty')):

        seriesname = {}
        data = {}        
        data["seriesname"]     = key['comName']
        data["value"]          = key['total_qty']
        dataSource["dataset"].append(data) 

这是我的查询的输出:

[
 {'date': '1398/08/01', 'comName': 'a', 'total_qty': 253.0}, 
 {'date': '1398/08/02', 'comName': 'a', 'total_qty': 263.0}, 
 {'date': '1398/08/01', 'comName': 'b', 'total_qty': 3.938}, 
 {'date': '1398/08/02', 'comName': 'b', 'total_qty': 31.625}
]

附加后的数据源:

"dataset": [
  {
    "seriesname": "a",
    "value": 253
  },
  {
    "seriesname": "a",
    "value": 263
  },
  {
    "seriesname": "b",
    "value": 3.938
  },
  {
    "seriesname": "b",
    "value": 31.625
  }

但我必须按以下方式获得它:

"dataset": [
{
    "seriesname": "a",
    "data": [
        {
            "value": "253"
        },
        {
            "value": "263"
        }]},
        {
    "seriesname": "b",
    "data": [
        {
            "value": "3.938"
        },
        {
            "value": "31.625"
        }]}
        ]
python django view nested django-queryset
1个回答
0
投票

您的问题不是真正的Django特定问题,而是一般的Python问题。您可以更改迭代,例如

def pr1(request):
    fdate = unidecode(str(request.GET.get('fdate')))
    tdate = unidecode(str(request.GET.get('tdate')))                

    dataSource = OrderedDict()
    dataSource["dataset"] = []

    seriesname = ''
    data = None

    for key in Production.objects.filter(date__range=(fdate, tdate)).values('date', 'comName').annotate(total_qty=Sum('qty')).order_by('comName':

        if not key['comName'] == seriesname:
            seriesname = key['comName']
            if data is not None:
                dataSource["dataset"].append(data)
            data = {
                'seriesname': key['comName'],
                'data': [
                    {'value': key['total_qty']}
                ]
            }
        else:
            data['data'].append({'value': key['total_qty']})

    dataSource["dataset"].append(data)

我已将order_by添加到您的查询集中,以使其正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.