Как передать дополнительный аргумент в get_serializer_class

Мне нужно выбрать сериализатор на основе значения экземпляра объекта. Как мне передать дополнительный аргумент в get_serializer_class, чтобы иметь возможность выполнить там валидацию?

def get_serializer_class(self, extra_option):
        if extra_option:
            return ModelSerializer
        return ModelSerializer2
serializer = self.serializer_class(data=request.data, extra_option=smth_instance)

Ошибка:

TypeError: Field.__init__() got an unexpected keyword argument 'extra_option'

Гораздо проще проверить действие, чтобы решить, какой сериализатор использовать. Ex.

def get_serializer_class(self):
  if self.action == "retrieve":
    return ModelOutputSerializer
  else:
    return ModelDefaultSerializer

В противном случае вам, вероятно, придется переопределить действие, для которого вы хотите использовать различные kwarg, и передать его вниз, переопределяя необходимые методы по ходу дела. Например,

def retrieve(self, request, *args, **kwargs):
  instance = self.get_object()
  serializer = self.get_serializer(instance, extra_option=...)
  return Response(serializer.data)

def get_serializer(self, *args, **kwargs):
  serializer_class = self.get_serializer_class(*args, **kwargs)
  kwargs.setdefault('context', self.get_serializer_context())
  return serializer_class(*args, **kwargs)

def get_serializer_class(self, *args, **kwargs):
  if kwargs.pop("extra_option", None):
    return ExtraOptionSerializer
  else:     
    return super().get_serializer_class()

Также ознакомьтесь с классическим DRF для справки: https://www.cdrf.co/3.13/rest_framework.viewsets/ModelViewSet.html#retrieve.

Надеюсь, это поможет!

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