You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键说明

  1. 先把每个item_id对应的所有字段和值组装成字典update_data
  2. 使用**update_data将字典解包为update()方法的关键字参数,此时字典的键会被当作实际的数据库字段名,值对应要更新的内容
  3. 这种写法还能避免内层循环,一次更新同一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:20:53