如何将前端传入的对象数组更新到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
相关产品推荐
相关产品推荐

