Django Rest Framework嵌套序列化器不生效问题求助
你的核心问题在于序列化时传入了错误的模型实例,导致反向关联的updated字段无法被正确序列化出来。让我一步步帮你梳理并解决:
1. 核心错误:序列化实例不匹配
在你的MappingSinglePhoto视图中,你查询的是UpdationImages的对象,然后尝试用RecievingImagesSerializer去序列化这些UpdationImages实例——但RecievingImagesSerializer是为RecievingImages模型设计的,updated字段是RecievingImages到UpdationImages的反向关联(通过related_name='updated'定义),只有序列化RecievingImages实例时,这个字段才会被正确填充。
2. 修正步骤
步骤1:修复序列化器的字段定义
首先你的RecievingImagesSerializer里有一个语法错误:rawImage没有加引号,fields列表需要的是字符串类型的字段名,否则会触发变量未定义的错误:
# serializer.py class RecievingImagesSerializer(serializers.ModelSerializer): updated = UpdatedImageSerializer(many=True, read_only=True) class Meta: model = RecievingImages # 修正:rawImage添加引号 fields = ('updated','name','area','number','agency_name', 'rawImage')
步骤2:修正视图逻辑,传入正确的实例
你需要先获取对应的RecievingImages对象,再用RecievingImagesSerializer序列化它,这样反向关联的updated字段就会自动包含所有关联的UpdationImages数据:
# views.py from rest_framework import status class MappingSinglePhoto(APIView): """ Mapping Single Image """ def post(self, request): try: data = request.data name_of_image = data['name'] # 获取对应的RecievingImages实例,而非UpdationImages receiving_image = RecievingImages.objects.get(name=name_of_image) serializer = RecievingImagesSerializer(instance=receiving_image) return Response(serializer.data) except RecievingImages.DoesNotExist: return Response({"error": "Target image not found"}, status=status.HTTP_404_NOT_FOUND) except Exception as e: print(e) return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
3. 为什么depth=1能工作?
当你设置depth=1时,DRF会自动递归序列化所有关联对象,即使你传入的实例不对(不过其实这时候可能是巧合),但这种方式会返回关联对象的所有字段,不符合你的需求。而正确的嵌套序列化可以精确控制返回的字段,这也是你想要的方式。
验证
现在当你发送请求时,serializer.data里就会包含updated字段,它是一个数组,每个元素都是符合UpdatedImageSerializer定义的结构。
内容的提问来源于stack exchange,提问作者Pradyum Gupta

