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
相关产品推荐
相关产品推荐

