Django如何接收ManyToManyField输入并在Postman测试接口?
问题解决方法
后端代码调整
你当前的ModuleSerializer中rooms字段设置了read_only=True,序列化器不会接收客户端传入的rooms参数,只会在返回数据时序列化该字段,首先需要调整序列化器逻辑:
class ModuleSerializer(serializers.ModelSerializer): # 原有只读字段,用于接口返回时序列化房间详情 rooms = RoomSerializer(read_only=True, many=True) # 新增可写字段,用于接收传入的房间ID列表,仅写入不返回 room_ids = serializers.ListField( child=serializers.IntegerField(), write_only=True, required=True # 若允许创建模块时不传房间,可改为False ) class Meta: model = Module fields = "__all__" # 可选:添加参数校验,避免传入不存在的房间ID def validate_room_ids(self, value): exist_room_ids = Rooms.objects.filter(room_id__in=value).values_list('room_id', flat=True) if len(exist_room_ids) != len(value): raise serializers.ValidationError("包含无效的房间ID") return value def create(self, validated_data): # 取出room_ids参数,不传入Module实例的创建逻辑 room_ids = validated_data.pop('room_ids') # 先创建Module对象 module = super().create(validated_data) # 批量关联房间 module.rooms.add(*room_ids) return module
接下来调整视图中的语法错误即可,无需额外修改逻辑:
class add_module(APIView): def post(self, request, format=None): module_serializer = ModuleSerializer(data=request.data) if module_serializer.is_valid(): module = module_serializer.save() return Response(module.module_id, status = status.HTTP_201_CREATED) # 修正原Response的字典语法错误 return Response({"response": module_serializer.errors}, status = status.HTTP_400_BAD_REQUEST)
Postman测试方法
方式1:JSON格式传参(推荐)
- 请求方式选择
POST,填入对应的接口地址 - 切换到
Body标签,选择raw,右侧格式选择JSON - 输入请求体示例如下,
room_ids数组内填需要关联的房间主键room_id即可:
{ "title": "测试模块", "desc": "模块描述内容", "is_deleted": false, "room_ids": [1,2,3] }
方式2:form-data格式传参
- 切换到
Body标签,选择form-data - 按照如下规则填写参数,数组类型参数通过键名加下标的方式传多个值:
| 键名 | 值 |
|---|---|
| title | 测试模块 |
| desc | 模块描述内容 |
| is_deleted | false |
| room_ids[0] | 1 |
| room_ids[1] | 2 |
| room_ids[2] | 3 |
内容的提问来源于stack exchange,提问作者somya goyal
相关产品推荐
相关产品推荐

