Использование поля метода сериализатора в другом поле метода
В моем сериализаторе есть поле метода, которое я хочу использовать в другом поле метода. Это лучше всего объяснить в коде:
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