Django如何将JSON键值对赋值给字段名匹配的模型对象
实现方法
直接用Python内置的动态属性赋值方法就能实现,额外加层字段合法性校验避免异常即可,补全后的完整函数如下:
def upload_object_values(model, json_values): if json_values: # 遍历字典副本移除id、外键字段,避免遍历过程中字典长度变化触发运行时错误 for key in json_values.copy(): # 用endswith判断后缀比切片判断更稳妥,不会因为键名长度不足3抛索引错 if key.endswith('_id') or key == 'id': json_values.pop(key) # 逐个给模型字段赋值 for field, value in json_values.items(): # 先确认模型存在同名字段再赋值,跳过不存在的字段避免AttributeError if hasattr(model, field): setattr(model, field, value) # 持久化保存 model.save()
逻辑说明
- 核心赋值逻辑靠
setattr(model, 字段名, 字段值)实现,效果和手动写model.name = 'world'这类硬编码赋值完全一致,能自动匹配字典里的键和模型同名字段 - 加
hasattr()校验是为了兼容json里混入模型未定义字段的场景,不会因为脏数据直接抛错中断流程 - 把原来的切片判断
json_value[-3:] == '_id'换成了字符串自带的endswith('_id')方法,避免键名长度小于3的时候触发索引越界错误
用给出的示例数据测试:清洗后的json是{'notes': 'hello', 'name': 'world', 'phone': None},遍历后三个字段都会正确赋值到model实例上,调用save()方法就能完成数据落库。
内容的提问来源于stack exchange,提问作者Prosy A.
相关产品推荐
相关产品推荐

