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

Django中ManyToMany字段处理form-data请求报错该如何解决?

问题核心原因
  1. form-data格式请求会被DRF解析为Django专属的QueryDict对象,其update方法行为和普通字典不同,无法正确存入你手动拼接的rooms列表数据,导致序列化器校验时认为rooms字段缺失。
  2. 代码存在多处序列化器命名拼写不一致的问题:房间序列化器定义为RoomSerialize,但模块序列化器、视图中引用的是RoomSerializerWrite、RoomSerializer,也可能引发异常。
解决方案

快速修复方案

直接将修改后的请求数据转为普通字典传入序列化器,规避QueryDict的特殊行为:
修改module/views.py中实例化序列化器的代码:

# 原代码
module_serializer = ModuleSerializer(data=new_request)
# 替换为
module_serializer = ModuleSerializer(data=dict(new_request))

规范优化方案

既然rooms字段完全通过room_list参数生成,不需要从客户端原始输入获取,直接将其设为只读字段,从根源上取消输入校验要求:
修改module/serializers.py中的字段定义:

class ModuleSerializer(serializers.ModelSerializer):
    # 新增read_only=True,该字段仅用于序列化输出,不校验输入
    rooms = RoomSerializer(many=True, read_only=True)
    # 剩余代码保持不变

该方案更符合DRF的设计规范,同时避免了form-data无法解析嵌套结构的共性问题。

额外注意事项
  • 先修正所有序列化器命名、文件名的拼写错误,比如将rooms/serialier.py改为rooms/serializers.py,房间序列化器类名改为统一的RoomSerializer
  • 如果请求需要上传文件,必须使用MultiPartParser解析form-data,这种场景下优先使用规范优化方案。

内容的提问来源于stack exchange,提问作者somya goyal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:18:03