Django循环处理数据无约束却未将所有值存入deposit_values字典问题
代码运行结果数量不一致原因分析
- 字典键唯一性覆盖:你使用
ba.id作为deposit_values字典的键,Python 字典的键具有唯一不可重复的特性,若多个Deposit对象关联到同一个Account,后续执行的deposit_values[ba.id] = d.amount会直接覆盖同键的已有值,不会新增字典条目。本次差值为2,大概率是存在2组Deposit记录对应同一个Account的情况,合并后少了2条条目,刚好匹配712到710的差值。 - 查询不满足条件导致数据丢弃:仅当
Account.objects.filter(pk=d.account.id)的查询结果恰好为1条时,才会触发字典写入逻辑。如果出现以下两种情况都会跳过写入:- 部分
Deposit关联的account.id不存在对应的Account记录(比如未开启外键约束时产生了脏数据),查询结果为空 - 极特殊场景下出现了重复主键的
Account记录,查询结果大于1条
上述情况都不会往字典中添加数据,会导致最终统计数量少于原始待处理数量。
- 部分
另外注意你的代码存在隐性bug:else分支直接调用print(ba.id),如果查询结果为空时ba变量未定义,会直接抛出NameError。如果你的代码运行没有报错,说明本次差值大概率是字典键覆盖导致的。
内容的提问来源于stack exchange,提问作者Atma
相关产品推荐
相关产品推荐

