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

如何将前端传入的对象数组更新到DRF模型的JSON字段中?

解决JSON字段更新问题

先处理前端数据格式转换

前端传入的status是包含多个单键对象的数组,需要先合并为一个字典,才能和模型里的order字段格式匹配:

# 从请求数据中提取前端传入的status列表
front_status = request.data.get("status", [])
updated_status = {}
for item in front_status:
    updated_status.update(item)
# 转换后得到:{"Key1": "Dummy", "Key2": "Dummy"}

获取目标模型实例

根据业务逻辑定位到需要更新的DummyModel对象,比如通过前端传入的user ID查询:

user_id = request.data.get("user")
# 这里假设每个用户对应一个DummyModel实例,根据实际场景调整查询条件
dummy_instance = DummyModel.objects.get(user_id=user_id)

合并并更新JSON字段

取出实例当前的order数据,和转换后的新数据合并——新值会覆盖对应键的旧值,未传入的键保留原有内容:

# 复制原有order数据,避免直接修改默认字典引发的共享问题
current_order = dummy_instance.order.copy()
# 合并新数据
current_order.update(updated_status)
# 赋值回实例
dummy_instance.order = current_order

保存更新

最后保存实例完成更新:

dummy_instance.save()

额外注意事项

模型中JSONField的default如果用可变对象(比如直接写字典),会导致所有实例共享同一个默认字典,修改一个实例的order会意外影响其他实例。建议把默认值改成可调用函数:

def get_default_status():
    return {
        'Key1': None,
        'Key2': None,
        'Key3': None,
        'Key4': None,
        'key5': None
    }

class DummyModel(BaseModel):
    # 注意这里User要大写,避免模型引用错误
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
    comments = models.TextField(blank=True, null=True)
    order = models.JSONField(default=get_default_status)

内容的提问来源于stack exchange,提问作者Arthur Dayne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:15:38