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)
Вернуться на верх