python - 用 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”。并保留订单。
解决方案
您可以简单地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
推荐阅读
- node.js - “使用 eventEmmiter(node.events) 修补工具以相互工作”是正确的方法吗?_ 节点
- ios - iOS应用程序崩溃的原因是什么?这是崩溃日志
- arrays - 函数中指向数组的双指针,如何访问
- typescript - 通用字符串上的打字稿条件类型
- javascript - 从firestore onSnapshot接收数据后,如何从节点js express服务器向客户端发送数据?
- java - Hibernate remove just the relation, not the entity on the relation
- google-colaboratory - 谷歌可乐。如何为读者隐藏python代码
- python - 无法根据不同的标题及其相应的段落对输出进行分层
- java - 双击也会触发 java.awt.event.MouseAdapter 中的单击
- java - 使用名称和抽象类创建 bean 时出错