Вычисление полей только для чтения сериализаторов

Вот пример:

# models.py
class MyModel(models.Model):
    ...
    metadata = models.JSONField()

# serializers.py
class MetadataSerializer(serializers.Serializer):
    x = serializers.IntegerField()
    y = serializers.IntegerField(read_only=True)

# views.py
class MyAPIView(APIView):
    def post(self, request):
        serializer = MetadataSerializer(data=request.data)
        serializer.is_valid()
        create_mymodel(metadata=serializer.validated_data)
        return Response(status=201)

Я хотел бы вычислить y на основе x с помощью "сложной" бизнес-логики y = const * x и сохранить результат в поле json.

Вопрос: Где я должен разместить эту бизнес-логику?

  • перед инициализацией сериализатора, перехватывая неизменяемые request.data
  • внутри сериализатора validate() или validate_y() метода.
  • используя get_y() из SerializerMethodField.
  • внутри create_mymodel() сервиса.
Вернуться на верх