如何序列化Django两张嵌套关联表,实现POST请求返回完整提交数据
修复方案
你的代码存在两处核心问题:一是序列化器返回字段名不符合预期,二是视图逻辑重复创建Album实例且最终序列化的是请求数据而非实际入库的关联数据。以下是完整修改代码:
1. 序列化器(serializers.py)修改
class AlbumImagesSerializer(serializers.ModelSerializer): class Meta: model = AlbumImages fields = ["media"] # 只返回需要的media字段,过滤多余的id、外键字段 class AlbumSerializer(serializers.ModelSerializer): # 把模型关联的albumimages字段别名改为media,匹配你需要的返回字段名 media = AlbumImagesSerializer(many=True, read_only=True, source="albumimages") class Meta: model = Album fields = ["name", "media"]
2. 视图(views.py)修改
@api_view(['POST']) def addAlbum(request): if request.method == 'POST': media_files = request.data.get('media', []) # 先校验是否上传了图片 if not media_files: return Response("Please upload the files", status=status.HTTP_400_BAD_REQUEST) serializer = AlbumSerializer(data=request.data) # 先校验参数合法再操作数据库,避免生成脏数据 if serializer.is_valid(): # 用序列化器创建Album实例,不要重复手动创建 album_instance = serializer.save() # 批量创建关联的图片记录 for file in media_files: AlbumImages.objects.create(media=file, album=album_instance) # 用已经关联了图片的实际入库实例重新序列化,就能拿到完整的返回数据 res_serializer = AlbumSerializer(album_instance) return Response(res_serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) return Response("Not found", status=status.HTTP_404_NOT_FOUND)
修改说明
- 模型文件无需任何修改,原有外键关联和
related_name配置正常可用 - 调整了参数校验顺序,避免参数校验失败还生成无效Album记录的问题
- 去掉了重复创建Album的逻辑,避免数据库生成多余的脏数据
- 最终返回的序列化结果基于实际入库的、已经关联了所有图片的Album实例,会自动带出所有关联的图片数据,返回格式完全符合需求:
{ "name": "My favourite songs list", "media": [ {"media": "filename1"}, {"media": "filename2"} ] }
注:你之前给出的预期返回格式存在JSON语法错误,同一个对象内不允许有重复的key,修正后的返回为上述符合JSON规范的格式,满足实际使用需求
内容的提问来源于stack exchange,提问作者Waseem
相关产品推荐
相关产品推荐

