如何使用JSON数组中的最大值更新Django模型
使用JSON列表字段更新Django模型的解决方案
最近我在工作中遇到个棘手的小问题:需要用JSON数据更新Django模型,但JSON里的initiative字段是包含多个数字的列表,示例数据如下:
[ {"fields": {"resources": [], "initiative": [8, 21, 22]}, "pk": 81}, {"fields": {"resources": [], "initiative": [5, 8, 22]}, "pk": 82}, {"fields": {"resources": [], "initiative": [8, 22]}, "pk": 83}, {"fields": {"resources": [], "initiative": [6]}, "pk": 84} ]
我手里有个待完善的update_model函数框架:
def update_model(): for row...
根据Django模型中initiative字段的类型不同,处理方式有两种,下面分别说明:
情况1:initiative是ManyToMany字段
如果你的模型里initiative是关联另一个模型的ManyToMany字段(比如关联了Initiative模型),不能直接给它赋值列表,得用set()方法来更新关联关系:
def update_model(json_data_list): # 替换成你实际的模型导入路径 from myapp.models import MyModel for row in json_data_list: try: # 获取要更新的模型实例 instance = MyModel.objects.get(pk=row['pk']) # 更新普通字段(比如resources,如果是普通字段的话) instance.resources = row['fields']['resources'] instance.save() # 用set()方法更新ManyToMany字段,传入列表即可 instance.initiative.set(row['fields']['initiative']) except MyModel.DoesNotExist: print(f"pk为{row['pk']}的实例不存在,跳过该条数据")
情况2:initiative是JSONField
如果模型里的initiative是Django自带的JSONField(用来直接存储列表、字典这类JSON结构),那处理起来就简单多了,直接像普通字段一样赋值就行:
def update_model(json_data_list): from myapp.models import MyModel for row in json_data_list: try: instance = MyModel.objects.get(pk=row['pk']) # 直接更新所有字段,包括列表类型的JSON字段 instance.resources = row['fields']['resources'] instance.initiative = row['fields']['initiative'] instance.save() # 如果你不需要触发模型的save信号,也可以用批量更新提升效率: # MyModel.objects.filter(pk=row['pk']).update(**row['fields']) except MyModel.DoesNotExist: print(f"pk为{row['pk']}的实例不存在,跳过该条数据")
一些注意事项
- 记得把代码里的
MyModel和myapp替换成你项目中实际的模型名和应用名 - 使用
update()方法批量更新时,不会触发模型的save()方法和相关信号,如果你的业务依赖这些信号,建议用instance.save()的方式 - 加上异常捕获可以避免因为某条无效数据导致整个更新流程中断
内容的提问来源于stack exchange,提问作者JAusm
相关产品推荐
相关产品推荐

