使用有效值填充动态列表查询集并将其合并

时间:2018-10-10 18:57:59

标签: python django

我正在尝试创建一个列表,其中包含12个月的时间以及您的尊敬值,但是如果要使用月份/值,则需要创建默认值“ 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”。并保留订单。 / p>

1 个答案:

答案 0 :(得分:1)

您可以使用setdefault()dict上进行工作:

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来获得一个不含单词“ Decimal”的字符串。