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

Django使用_meta.get_fields()动态给ORM字段赋值始终为None如何解决

问题根因

你代码中的赋值逻辑存在语法错误:

tower_data.mfield = tower_data_cell_value

这行代码的作用是给tower_data对象新增了一个名为mfield的自定义属性,而非将mfield变量存储的字段名作为目标属性赋值,所以模型的原生字段全程没有被修改,保存到数据库自然全部为空。你打印的tower_data.mfield是你自己新增的临时属性,和模型自带的ph等字段完全无关。

解决方案

将BEGIN到END块内的代码修改为如下内容即可:

# ****************** BEGIN ****************** #
site_fields = tower_data._meta.get_fields()
site_fields_names = [f.name for f in site_fields][1:]
for mfield in site_fields_names:
    if any(word in str(mfield) for word in TOWER_DATA_EXCLUDE_FIELDS_NEW):
        continue
    else:
        ROW_IDX += 1
    tower_data_cell = str(col)+str(ROW_IDX)
    tower_data_cell_value = ws[tower_data_cell].value
    # 用setattr动态给对应字段名赋值
    setattr(tower_data, mfield, tower_data_cell_value)
    if str(mfield) == 'ph': # Example Field
        print(getattr(tower_data, mfield))
        print(tower_data.ph)
# ******************* END ******************* #

额外优化建议

  • 你当前先调用TowerData.objects.create()再赋值再save()的逻辑会产生两次数据库写入,建议改为先实例化再赋值再保存,减少数据库开销:
    # 替换原来的create写法
    tower_data = TowerData(company_tower_id=c_tower_object)
    # 中间字段赋值逻辑不变
    tower_data.save() # 仅写入一次数据库
    
  • 所有filter()[0]的写法建议替换为filter().first()并增加空值判断,避免没有匹配数据时抛出索引异常。
  • 读取Excel单元格值时注意和模型字段类型匹配,避免将数值、日期类型直接转成字符串存入数据库导致格式错误。

内容的提问来源于stack exchange,提问作者Jack Davidson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:15:05