繁体   English   中英

如何使用 PUT 请求在响应中发送多个字段?

[英]How to send several fields in the response with a PUT request?

我希望当我的 PUT 请求成功时,它返回一个包含我的PlantSerializer中所有字段的响应,因为当前响应返回给我这个:

{
   "id":48,
   "name":"Jar",
   "width":"50",
   "height":"50",
   "exposure":"None",
   "qr_code":"",
   "garden":65,
   "plant":[
      7
   ]
}

但是,我希望响应返回这个:

{
   "id":48,
   "name":"Jar",
   "width":"50",
   "height":"50",
   "exposure":"None",
   "qr_code":"",
   "garden":65,
   "plant":[
      "id":7,
      "name":"Artichoke",
      "image":null
   ]
}

我怎样才能达到这个结果?

这是我的序列化程序和我的 model class:

 class Plot(models.Model): name = models.CharField(max_length=50) garden = models.ForeignKey('perma_gardens.Garden', on_delete=models.CASCADE) width = models.CharField(max_length=50, blank=True, null=True) height = models.CharField(max_length=50, blank=True, null=True) plant = models.ManyToManyField('perma_plants.Plant', related_name='%(class)s_plant', blank=True) # Here is my serializers: class GardenSerializer(serializers.ModelSerializer): class Meta: model = Garden fields = ('id', 'name',) class PlantSerializer(serializers.ModelSerializer): class Meta: model = Plant fields = ('id', 'name', 'image') class ReadPlotSerializer(serializers.ModelSerializer): garden = GardenSerializer(required=True) plant = PlantSerializer(many=True) id = serializers.IntegerField(read_only=True) class Meta: model = Plot fields = '__all__' read_only_fields = [fields] class WritePlotSerializer(serializers.ModelSerializer): class Meta: model = Plot fields = '__all__'

这是我的观点:

 class PlotViewSet(viewsets.ModelViewSet): queryset = Plot.objects.all() def create(self, request, *args, **kwargs): serializer = WritePlotSerializer(data=request.data, many=isinstance(request.data, list)) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def delete(self, request, pk): snippet = self.get_object(pk) snippet.delete() return Response(status=status.HTTP_204_NO_CONTENT) def partial_update(self, request, *args, **kwargs): instance = self.queryset.get(pk=kwargs.get('pk')) serializer = WritePlotSerializer(instance, data=request.data, partial=True) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data) def get_serializer_class(self): if self.action in ("list", "retrieve"): return ReadPlotSerializer return WritePlotSerializer

在功能partial_update中,您正在使用WritePlotSerializer ,它仅通过fields=__all__值隐式具有plant字段。 这可能导致 drf 使用PrimaryKeyRelatedField ,因此您不会获得在PlantSerializer中定义的所有额外字段。

如果我理解 correctyl,您想在更新中使用WritePlotSerializer ,但在返回ReadPlotSerializer时使用 ReadPlotSerializer。您可能应该通过覆盖update方法将它们组合在一个序列化程序中,以支持更新嵌套的Plant对象。 这是相关文档

或者,如果您不想更新Plants值,您可以在所有调用中使用略微修改的ReadPlotSerializer版本:


class PlotSerializer(serializers.ModelSerializer):
    garden = GardenSerializer(required=True, read_only=True)
    plant = PlantSerializer(many=True, read_only=True)
    id = serializers.IntegerField(read_only=True)

    class Meta:
        model = Plot
        fields = '__all__'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM