Python Django-动态发布字典或字典列表(不工作)

Python Django-动态发布字典或字典列表(不工作),python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个基于类的视图,它通过get和post函数继承自ApiView。我编写了一个自定义mixin来添加post请求的功能,以接受对象列表和单个对象。当我让类继承mixin时,什么都没有发生 class CreateListModelMixin: def get_serializer(self, *args, **kwargs): """ if an array is passed, set serializer to many "

我有一个基于类的视图,它通过get和post函数继承自ApiView。我编写了一个自定义mixin来添加post请求的功能,以接受对象列表和单个对象。当我让类继承mixin时,什么都没有发生

class CreateListModelMixin:

    def get_serializer(self, *args, **kwargs):
        """ if an array is passed, set serializer to many """
        if isinstance(kwargs.get('data', {}), list):
            kwargs['many'] = True
        return super(CreateListModelMixin, self).get_serializer(*args, **kwargs)

class User_ListView(CreateListModelMixin, APIView):
    def get(self):
        db_data = User.objects.all().prefetch_related("installation_mast")
        serializer = User_Serializer(db_data, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = User_Serializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
未调用mixin的get_序列化程序方法。
任何帮助都将不胜感激

在DRF APIView的界面中,永远不会使用get_序列化程序方法。即使使用了它,上面的代码也不会工作,因为Python中的“方法解析顺序”

在Python中,“方法解析顺序”是从左到右。所以,当您继承一个mixin类时,您应该将其写入要重写的类的左侧

注:
如果要使用正在调用的“get_serializer”方法,则可能需要查看ModelViewSet(对于官方文档:)

APIView没有get_serializer方法,因此无法覆盖它。要解决此问题,需要设置使用GenericAPIView,设置serializer类并使用get_serializer()函数在post方法中获取序列化程序。工作代码如下所述

class CreateListModelMixin:

    def get_serializer(self, *args, **kwargs):
        """ if an array is passed, set serializer to many """
        if isinstance(kwargs.get('data', {}), list):
            kwargs['many'] = True
        return super(CreateListModelMixin, self).get_serializer(*args, **kwargs)

class User_ListView(CreateListModelMixin, GenericAPIView):
    permission_classes = [DjangoCustomModelPermissions]
    queryset = User.objects.all()
    serializer_class = User_Serializer

    def get(self):
        db_data = self.get_queryset()
        serializer = self.get_serializer(db_data, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

如果请求是字典或字典列表,则可以成功地动态发布请求。

谢谢!我不想使用modelViewSet,因为这是更大应用程序的一部分,我无法使用它。ApiView本身是否有其他方法可以做到这一点,以便post方法可以自动检测请求中传递的列表,并将many=True参数添加到序列化中?您提到的功能来自GenericApiView。如果不愿意使用ModelSerializer,可以显式继承所使用的混合。文件:@dracarys@KutyAslan我试着用GenericApiView来做,但仍然不起作用。我已经更新了问题中的代码。