首页 > 解决方案 > 用 ausent 值填充动态列表查询集并将其合并

问题描述

我正在尝试创建一个包含 12 个月和您的尊重价值的列表,但如果月/价值 ausent 我需要创建一个默认的“0”并与动态数据合并。

from collections import OrderedDict
_qs = CheckOut.objects.filter(date_service__year=datetime.datetime.now().year)\
    .values_list('date_service__month')\
    .annotate(total=Sum('checkoutitem__total_value'))\
    .order_by('date_service__month')

dt = OrderedDict(_qs)  # Wrap queryset with an OrderedDict

months = list(dt.keys())
valore = list(dt.values())
extra_context['profit'] = [months, valore]

模板django中的结果:

 [[9, 10, 11], [Decimal('800.00'), Decimal('300.00'), Decimal('100.00')]] 

所以,我需要创建月份:1,2,3,4,5,6,7,8,12 并创建值(如果查询集中不存在,则默认为“0”。并保留订单。

标签: pythondjango

解决方案


您可以简单地dict使用 using setdefault()

dt = OrderedDict(_qs)  # Wrap queryset with an OrderedDict

for i in range(1, 13):
    dt.setdefault(i, Decimal('0.00'))

如果键不存在,这只会插入值 0。


编辑

如果你希望它被排序并作为字符串,你可以创建一个新的字典;因为它的字典很小,与查询相比,成本几乎可以忽略不计。

dt = OrderedDict(sorted(
    (k, str(v))
    for k, v in dt.items()))

这应该使用数字来获得一个没有“十进制”一词的字符串str()Decimal


推荐阅读