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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:39:48