Использование внешнего ввода для сериализатора фреймворка отдыха Django
У меня есть класс со значением в американских центах. Когда я его сериализую, я хочу иметь возможность конвертировать его в динамически заданную другую валюту. Таким образом, класс выглядит следующим образом:
class Evaluation(models.Model):
sum_in_cents = models.IntegerField()
def converted_sum_in_cents(currency_code):
currency_code = currency_code.upper()
CurrencyConverter().convert(self.sum_in_cents / 100, 'USD', currency_code)
... #other stuff
И у него есть стандартный сериализатор, который в настоящее время игнорирует эту функцию:
class EvaluationSerializer(serializers.ModelSerializer):
class Meta:
model = Evaluation
fields = '__all__'
depth = 1
Как при использовании сериализатора получить аргумент currency_code для метода converted_sum_in_cents? (он передается как строка запроса в представлении)
Мне удалось узнать, что я могу передать объект context при инициализации моего сериализатора и что функции сериализатора могут получить доступ к данным в нем, но я не могу понять, как включить вывод этих функций в поле сериализатора. Я также нашел эту тему , которая является моим запасным планом, но и автор этой темы, и я подозреваем, что если бы это был правильный способ сделать что-то, что, кажется, должно возникать часто, DRF включил бы гораздо менее хакерский путь для этого. Так может я просто думаю об этом неправильно?
Я нашел способ:
При инстанцировании класса EvaluationSerializer я опционально передаю аргумент контекста, как указано в ОП, описанный здесь.
Все методы класса затем имеют доступ к этому объекту. Часть, которую я пропустил, описана в этом ответе StackOverflow:
Создайте поле пользовательского метода на объекте и определите метод get_<custom_field_name> для установки значения. Таким образом, класс Evaluation выглядит следующим образом:
class EvaluationSerializer(serializers.ModelSerializer):
converted_cost_per_output = serializers.SerializerMethodField()
def get_converted_cost_per_output(self, evaluation):
currency_code = self.context['currency'].upper()
return CurrencyConverter().convert(evaluation.cents_per_output / 100, 'USD', currency_code)
(и в модели не определен метод)