首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -动态发布字典或字典的列表(不工作)

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

Stack Overflow用户
提问于 2021-04-23 19:52:22
回答 2查看 166关注 0票数 0

我有一个基于类的视图,它继承自带有get和post函数的ApiView。我编写了一个定制的混入,为post请求添加了接受对象列表和单个对象的功能。当我让类继承混入时,什么也不会发生

代码语言:javascript
复制
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方法。任何帮助我们都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-26 17:54:22

APIView没有get_serializer方法,因此不能被重写。要解决这个问题,您需要设置使用GenericAPIView,设置序列化程序类,并使用get_serializer()函数在post方法中获取序列化程序。下面提到了一个有效的代码

代码语言:javascript
复制
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)

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

票数 0
EN

Stack Overflow用户

发布于 2021-04-23 20:14:20

在DRF的接口中,从来没有使用过get_serializer方法。即使使用了它,上面的代码也不会工作,因为Python中的“方法解析顺序”。

在Python中,“方法解析顺序”是从左到右。因此,当你继承一个混入类时,你应该把它写在你想要覆盖的类的左边。

注意:如果你想使用被调用的"get_serializer“方法,那么你可能需要看看ModelViewSets (官方文档:https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67229466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档