[英]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.