如何在Django的create()中通过循环引用模型字段创建记录?
解决方法
你的问题核心是没搞懂Django create() 方法的参数传递逻辑,直接用字典解包就能搞定,根本不需要写循环或者原生SQL。
直接用字典解包(最简便)
既然接口返回的JSON键和模型字段名完全一一对应,直接把字典用**解包后传给create()就行:
import requests from .models import ModelOne r = requests.get(url).json() # 直接解包字典作为关键字参数 ModelOne.objects.create(**r)
这行代码完全等效于你想要的手动写fieldone=r['fieldone'], fieldtwo=r['fieldtwo']的效果。
处理可能的多余字段(可选)
如果接口返回的JSON里有模型不存在的字段,直接解包会报错,这时候可以先过滤字典,只保留模型有的字段:
# 获取ModelOne所有手动定义的字段名称(排除自动生成的如id) model_field_names = [field.name for field in ModelOne._meta.get_fields() if not field.auto_created] # 过滤出和模型字段匹配的键值对 filtered_data = {key: value for key, value in r.items() if key in model_field_names} ModelOne.objects.create(**filtered_data)
为什么你的原写法不行?
你原来在create()里写循环、用ModelOne.field赋值的方式完全错误:
create()的括号里只能放关键字参数,不能写循环语句;ModelOne.field是访问模型类的属性,不是给要创建的实例赋值,所以根本不会把数据传给create(),自然不会生成数据库记录。
总结
完全不需要用原生SQL,Django的QuerySet API就能完美解决这个需求,字典解包是最简洁高效的方式。
内容的提问来源于stack exchange,提问作者vizyourdata
相关产品推荐
相关产品推荐

