我有一个基于类的视图,它继承自带有get和post函数的ApiView。我编写了一个定制的混入,为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, 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_serializer方法。任何帮助我们都将不胜感激。
发布于 2021-04-26 17:54:22
APIView没有get_serializer方法,因此不能被重写。要解决这个问题,您需要设置使用GenericAPIView,设置序列化程序类,并使用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)如果请求是字典或字典列表,则可以成功地动态发布请求。
发布于 2021-04-23 20:14:20
在DRF的接口中,从来没有使用过get_serializer方法。即使使用了它,上面的代码也不会工作,因为Python中的“方法解析顺序”。
在Python中,“方法解析顺序”是从左到右。因此,当你继承一个混入类时,你应该把它写在你想要覆盖的类的左边。
注意:如果你想使用被调用的"get_serializer“方法,那么你可能需要看看ModelViewSets (官方文档:https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset)。
https://stackoverflow.com/questions/67229466
复制相似问题