Python多OR条件判断如何定位具体触发分支(Django场景)
实现方案
不要用链式or拼接判断条件,这种写法一旦命中第一个符合条件的分支就会短路,既无法捕获同时发生的多字段变更,也很难直接定位触发条件。最简洁的实现方式是通过字段映射遍历比对,直接收集所有变更的字段信息,代码可维护性也更高:
# 配置需要比对的字段映射:key为Image模型的字段名,value为API返回的对应值 check_field_map = { "shoper_gfx_id": shoper_gfx_id, "shoper_product_id": shoper_product_id, "shoper_main": shoper_main, "shoper_order": shoper_order, "shoper_image_name": shoper_image_name, "shoper_unic": shoper_unic, "shoper_hidden": shoper_hidden, "shoper_extension": shoper_extension, } changed_records = [] for field_name, api_val in check_field_map.items(): local_val = str(getattr(image, field_name)) api_val_str = str(api_val) if local_val != api_val_str: # 收集变更字段的字段名、本地旧值、API新值 changed_records.append({ "field": field_name, "old_value": local_val, "new_value": api_val_str }) if changed_records: # 1. 执行模型更新 for change in changed_records: setattr(image, change["field"], change["new_value"]) image.save() # 2. 写入变更日志,直接把changed_records存入日志模型即可 # 示例日志存储逻辑: # ImageUpdateLog.objects.create( # target_image=image, # change_detail=changed_records, # update_time=datetime.now() # )
方案优势
- 无重复代码,后续新增/删减需要比对的字段时,只需要修改
check_field_map字典即可,不需要调整判断逻辑 - 可以一次性捕获所有发生变更的字段,不会出现多字段同时变更时只识别到第一个的问题
- 收集到的
changed_records可以直接序列化存入日志,查询日志时可以清晰看到每个字段的变更前后值,不需要额外做二次处理
如果你不想大幅调整原有代码结构,也可以把所有or拆分成分立的if判断,逐个收集变更字段,但这种写法冗余度高,后续维护成本高,不推荐使用:
changed_records = [] if str(image.shoper_gfx_id) != str(shoper_gfx_id): changed_records.append({"field":"shoper_gfx_id", "old_value":image.shoper_gfx_id, "new_value":shoper_gfx_id}) if str(image.shoper_product_id) != str(shoper_product_id): changed_records.append({"field":"shoper_product_id", "old_value":image.shoper_product_id, "new_value":shoper_product_id}) # 其余字段按相同格式逐个补全if判断即可,注意不要用elif,否则会漏判后续变更 if changed_records: # 执行更新、写日志逻辑
内容的提问来源于stack exchange,提问作者Grzegorz Z.
相关产品推荐
相关产品推荐

