Django - BaseSerializer.is_valid() отсутствует 1 необходимый позиционный аргумент: 'self'
Я создаю базовый класс viewset и пытаюсь использовать его в двух классах. У viewset есть метод create, который использует get_serializer_class() для получения сериализатора и создает объект. Но метод is_valid() выбрасывает ошибку
TypeError: BaseSerializer.is_valid() отсутствует 1 необходимый позиционный аргумент: 'self'
Вот базовый класс:
class BaseViewSet(BaseFilterViewSet):
permission_classes = [IsAuthenticated]
def create(self, request: Request, *args: Any, **kwargs: Any) -> Response:
context = super(BaseViewSet, self).get_serializer_context()
context.update({"request": request})
# serializer = super(BaseViewSet, self).get_serializer_class()
serializer = self.get_serializer_class()
serializer(data=request.data, context=context)
serializer.is_valid(raise_exception=True)
serializer.save(created_by=request.user)
return Response(serializer.data, status=HTTP_201_CREATED)
Вот дочерний класс, который использует этот набор представлений и определяет метод get_serializer_class.
class ChildViewSet(BaseViewSet):
queryset = Child.objects.all().select_related("model2")
permission_classes = [IsAuthenticated]
def get_serializer_class(self) -> Type[BaseSerializer[_MT_co]]:
if self.action == "stock":
return StockSerializer
else:
return ChildSerializer
Большое спасибо за предоставленные материалы и помощь.
You can use .get_serializer(…) [drf-doc]: this will automatically create the serializer with the serializer class that is specified in the .get_serializer_class() [drf- doc] with the context retrieved by the .get_serializer_context(…) method call [drf-doc] that already contains the request (as well as the view and the format). You thus can implement this as:
class BaseViewSet(BaseFilterViewSet):
permission_classes = [IsAuthenticated]
def create(self, request: Request, *args: Any, **kwargs: Any) -> Response:
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save(created_by=request.user)
return Response(serializer.data, status=HTTP_201_CREATED)