我正在尝试创建一个列表,其中包含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>
答案 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”的字符串。