Как передать дополнительный аргумент в 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.
Надеюсь, это поможет!