Python Django-动态发布字典或字典列表(不工作)
我有一个基于类的视图,它通过get和post函数继承自ApiView。我编写了一个自定义mixin来添加post请求的功能,以接受对象列表和单个对象。当我让类继承mixin时,什么都没有发生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 "
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来做,但仍然不起作用。我已经更新了问题中的代码。