Избегайте, чтобы данные ответов PUT содержали полные данные с помощью вложенного сериализатора и обобщенных представлений c (Django Rest Framework) - PullRequest
0 голосов
/ 02 апреля 2020

Я создаю API на основе RetrieveUpdateAPIView с записываемыми вложенными сериализаторами . У меня проблема в том, что когда я делаю запрос PUT, данные ответа содержат все данные сериализатора ... И объем этих данных довольно большой.

Как я могу изменить свой код, чтобы избежать такого поведения? Я полагаю, что это должно быть на уровне представления? Я бы предпочел придерживаться обобщенных c представлений.

Спасибо за вашу поддержку.

За запись,

Вот код сериализатора:

# DatetimeValue serializer
class DatetimeValueSerializer(serializers.ModelSerializer):
    class Meta:
        model = DatetimeValue
        fields = ['date_time', 'value']


# Serializer that includes time series header and date time values
class TimeSeriesValueSerializer(serializers.ModelSerializer):
    values = DatetimeValueSerializer(many=True)

    class Meta:
        model = TimeSeries
        fields = ['id', 'name', 'values']

    def update(self, instance, validated_data):
        ts_name = validated_data.pop('name')

        try:
            time_series = TimeSeries.objects.get(name=ts_name)
        except ObjectDoesNotExist:
            raise ValidationError(_(f"Time series doesn't exist"))

        values_data = validated_data.pop('values')
        for datetime_value in values_data:
            try:
                DatetimeValue.objects.create(time_series=time_series, **datetime_value)
            except IntegrityError:
                raise ValidationError(_(f"ERROR in 'date_time' and/or 'value' provided. "
                                        f"'date_time' has to be a correct date time format and 'value' a float. "
                                        f"A 'date_time' has to be unique for a given time series"))
        return time_series

И код вида:

# View to get time series datetime values
class TimeSeriesValueDetail(generics.RetrieveUpdateAPIView):
    queryset = TimeSeries.objects.all()
    serializer_class = TimeSeriesValueSerializer

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете изменить serialzier_class в зависимости от request.method, используя get_serializer_class

class TimeSeriesValueDetail(generics.RetrieveUpdateAPIView):
    queryset = TimeSeries.objects.all()
    serializer_class = TimeSeriesValueSerializer

    def get_serializer_class(self):
        if self.request.method == 'PUT':
            return ShortTimeSeriesSerializer
        return super().get_serializer_class()

или вы можете вернуть пользовательские данные в конце обработчика put:

class TimeSeriesValueDetail(generics.RetrieveUpdateAPIView):
    def put(self, request, *args, **kwargs):
        self.update(request, *args, **kwargs)        
        return Response(data={'success':True})

или вы можете вернуть некоторые другие данные после обновления:

class TimeSeriesValueDetail(generics.RetrieveUpdateAPIView):
    ...
    def update(self, request, *args, **kwargs):
        super().update(request, *args, **kwargs)
        return Response(data={'success':True})
...