Использование поля метода сериализатора в другом поле метода

В моем сериализаторе есть поле метода, которое я хочу использовать в другом поле метода. Это лучше всего объяснить в коде:

class ExampleSerializer(serializers.ModelSerializer):
    data = serializers.CharField()
    analyzed_data = serializers.SerializerMethodField()
    analyzed_analyzed_data = serializers.SerializerMethodField()

    class Meta:
        model = DataProviderModel
        fields = "__all__"

    def get_analyzed_data(self, obj):
        pass
    
    def get_analyzed_analyzed_data(self):
        # use analyzed_data here
        pass

Так что я хочу, чтобы пользователи видели первый шаг анализа данных, а затем анализировали те же данные дальше. Возможно ли это? Может быть, этого не следует делать?

Я бы использовал подход to_reprensentation() для редактирования значений из экземпляра.

.to_representation(self, value) метод. Этот метод принимает цель поля в качестве аргумента value, и должен возвращать представление, которое должно быть использовано для сериализации цели. Значение обычно является экземпляром модели.

Другими словами, вы можете использовать метод to_representation() даже для добавления значений, которые даже не существуют в полях из модели. Например, если вы хотите добавить еще одно поле, например "apple":5, вы можете это сделать, хотя оно не существует в self.Meta.model.

Поэтому я позволил себе создать ответ таким образом, как я это делаю обычно. Таким образом, у вас гораздо больше свободы делать с данными все, что вы хотите, без многочисленных проверок со стороны фреймворка.

class ExampleSerializer(serializers.ModelSerializer):

    class Meta:
        model = DataProviderModel
        fields = "__all__"

    def analyze_data(self, data):
        # do all things needed here.
        return analyzed_data

    def analyze_analyzed_data(self, analyzed_data):
        # do all things needed here.
        return analyzed_analyzed_data
     
    def to_representation(self, instance):

        analyzed_data = self.analyzed_data(instance.data)
        analyzed_analyzed_data = self.analyzed_analyzed_data(analyzed_data)

        data = {
                "data": instance.data,
                "analyzed_data": analyzed_data,
                "analyzed_analyzed_data": analyzed_analyzed_data
                }

         return data

Вернуться на верх