Как передать запрос полевому сериализатору в Rest Framework? - PullRequest
0 голосов
/ 05 марта 2020

Привет! Я использую полевой сериализатор, чтобы иметь возможность сериализовать поле PK и десериализовать его как объект. Внутри сериализатора есть SerializerMethodField для создания пользовательского URL. Это работает, когда я использую себя из сериализации своей собственной записи. Однако когда я использую его для другого сериализатора как FieldSerializer, объект request не передается.

class TelemetryFileSerializer(serializers.ModelSerializer):
    telemetry_type = serializers.SlugRelatedField(
        slug_field='name', queryset=TelemetryFileType.objects.all())
    receiving_station = serializers.SlugRelatedField(
        required=False, slug_field='name', queryset=ReceivingStation.objects.all())
    link = serializers.SerializerMethodField()

    class Meta:
        model = TelemetryFile
        fields = '__all__'

    def get_link(self, object):
        request = self.context.get('request')
        print(self.context)   # request is not passed here from RawImageSerializer/TelemetryFileField
        return request.build_absolute_uri('/data_management/telemetry_files/{}'.format(object.id))


class TelemetryFileField(serializers.PrimaryKeyRelatedField):

    def to_representation(self, value):
        pk = super(TelemetryFileField, self).to_representation(value)
        item = TelemetryFile.objects.get(pk=pk)
        serializer = TelemetryFileSerializer(item)
        return serializer.data


class RawImageSerializer(serializers.ModelSerializer):
    from_telemetry_file = TelemetryFileField(queryset=TelemetryFile.objects.all())
    link = serializers.SerializerMethodField()

Я хочу передать запрос самого себя, чтобы иметь возможность создать его URL , Это возвращается, когда я использую RawImageSerializer:

AttributeError: у объекта 'NoneType' нет атрибута 'build_absolute_uri'

Должен быть способ пройти request из сериализатора в другой ...

1 Ответ

0 голосов
/ 05 марта 2020

Я не уверен, что это правильное решение, но добавление этого решило мою проблему ...

class TelemetryFileField(serializers.PrimaryKeyRelatedField):

    def to_representation(self, value):
        print("value", self.context)
        pk = super(TelemetryFileField, self).to_representation(value)
        item = TelemetryFile.objects.get(pk=pk)
        serializer = TelemetryFileSerializer(item, context=self.context) # context was added
        return serializer.data
...