如何在Django中将查询集的值作为列表填充嵌套字典

时间:2019-07-17 08:31:37

标签: python django dictionary

我有一本这样的字典:

result = { 'year' : {} }

,我有一个这样的查询集:

<QuerySet [{'building_id': 1, 'year': 2019, 'demand': 123.34}, {'building_id': 1, 'year': 2019, 'demand': 345.0}, {'building_id': 1, 'year': 2019, 'demand': 12345.0}, {'building_id': 2, 'year': 2019, 'demand': 345.0}]>

现在,我想将queryset的值转换为嵌套字典,使其看起来像这样:

result = { 'year' : {'1' : [123.34, 345.0, ...], '2' : [345, ...] }

我得到这样的查询集,因此它目前处于循环中:

    for item in buildings:
        demand_cool_item = item.demandcool_set.filter(year=passed_year).values('building_id', 'year', 'demand')

对于初学者,我试图遍历整个查询集,将其推入数组,然后像下面这样更新字典中的字典:

demand_cool_list = []

    for item in buildings:
        demand_cool_item = item.demandcool_set.filter(year=passed_year).values('building_id', 'year', 'demand')
        demand_cool_list.append(demand_cool_item)


    for item in demand_cool_list:
        result.update(item)


也尝试过result.update(item['building_id']['demand'])

表示字典更新序列元素#0的长度为3; 2是必需的,或者我有类型错误。 ! 有人可以帮我这个忙吗?高度赞赏!预先感谢

1 个答案:

答案 0 :(得分:1)

您可以遍历查询集,然后将值附加到适当的列表中,例如:

from collections import defaultdict

year_dict = defaultdict(list)
for demand in item.demandcool_set.filter(year=passed_year):
    year_dict[demand.building_id].append(demand.demand)

result = {'year': dict(year_dict)}

或者我们可以在此处使用itertools.groupby

from itertools import groupby
from operator import itemgetter

result = { 'year': {
    k: [v['demand'] for v in vs]
    for k, vs in groupby(
        item.demandcool_set.filter(
            year=passed_year
        ).values('building_id', 'demand').order_by('building_id'),
        itemgetter('building_id')
    ))
  }}

因此,结果将包含一个键'year',该键映射到一个字典,该字典将building_id s映射到demand s。

请注意,如果您未按某个时间戳对查询集进行排序,则值可以按任何顺序出现,因此,不能保证列表中的顺序 。因此,您可能需要向查询集添加.order_by(..)子句。