Django问题:数据库列无法通过变量更新,被当作硬编码名称
动态更新Django数据库列的实现方案
你当前的代码无法识别动态字段变量,核心原因是Django的update()方法会把field = value里的field当作硬编码的字段名称,而非变量。要实现动态更新数据库列的需求,通过字典解包就能解决:
原问题代码
def update_itemamadeus(check_flight_differences): for item_id, flight_details in check_flight_differences.items(): for field, value in flight_details.items(): ItemAmadeus.objects \ .filter(Q(id=item_id)) \ .update( field = value ) return
问题说明
当传入示例参数(item_id=130、field=code_airport_from_id、value=BCN)时,代码会尝试更新名为field的数据库列,而非code_airport_from_id,因此触发数据库字段不存在的错误。
修改后的代码
def update_itemamadeus(check_flight_differences): for item_id, flight_details in check_flight_differences.items(): # 将字段和值整理为字典,通过解包传入update方法 update_data = {field: value for field, value in flight_details.items()} ItemAmadeus.objects.filter(id=item_id).update(**update_data) return
关键说明
- 先把每个
item_id对应的所有字段和值组装成字典update_data - 使用
**update_data将字典解包为update()方法的关键字参数,此时字典的键会被当作实际的数据库字段名,值对应要更新的内容 - 这种写法还能避免内层循环,一次更新同一个
item_id的多个字段,提升数据库操作效率
如果只需要单字段更新,也可以直接在循环里用**{field: value}传入:
def update_itemamadeus(check_flight_differences): for item_id, flight_details in check_flight_differences.items(): for field, value in flight_details.items(): ItemAmadeus.objects.filter(id=item_id).update(**{field: value}) return
内容的提问来源于stack exchange,提问作者Duvan Smuts
相关产品推荐
相关产品推荐

