首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DRF ListField反序列化GET's queryparams中的ids列表

DRF ListField反序列化GET's queryparams中的ids列表
EN

Stack Overflow用户
提问于 2015-06-26 23:12:36
回答 3查看 5.7K关注 0票数 1

尝试使用DRF的ListField选项来反序列化查询参数中的值列表(下面示例中的应用程序)。我很难让它起作用。在网上找不到例子。希望有人帮忙。

api/getAppStats/?applications=one,two,three

代码语言:javascript
运行
复制
class MySerializer(serializers.Serializer):
 applications = serializers.ListField(child=serializers.CharField())
 start_date = serializers.DateField(default=(datetime.datetime.utcnow() - datetime.timedelta(days=30)).date().isoformat())
 end_date = serializers.DateField(default=datetime.datetime.utcnow().date().isoformat())

class SomeView(generics.GenericAPIView):
 """

 """
 permission_classes = [AllowAny]
 serializer_class = MySerializer

 def get(self, request, *args, **kwargs):

    """ 
    Just return query params..
    """
    serializer = MySerializer(data=request.query_params)

    if not serializer.is_valid():
        return Response({'stats':'invalid input data'})

    return Response({'stats':serializer.data})

我只看到这个-

代码语言:javascript
运行
复制
 {
            "stats": {
                "applications": [],
                "start_date": "2015-05-27",
                "end_date": "2015-06-26"
            }
        }

我是否以不正确的方式发送输入参数?我错过了一些琐碎的东西吗?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-27 05:19:40

为同一密钥发送多个参数的标准方法是使用相同的密钥名两次。

你可以这样做:

代码语言:javascript
运行
复制
/getAppStats/?applications=one&applications=two&applications=three

另外,您的服务器将以数组(即applications[]而不是applications )的形式接收应用程序。

代码语言:javascript
运行
复制
class SomeView(generics.GenericAPIView):
 """

 """
 permission_classes = [AllowAny]
 serializer_class = MySerializer

 def get(self, request, *args, **kwargs):

    """ 
    Just return query params..
    """

    # get the applications list
    applications = request.query_params.getlist('applications[]')

    # create a dictionary and pass it to serializer
    my_data = {'applications': applications, ...}

    serializer = MySerializer(data=my_data)

    if not serializer.is_valid():
        return Response({'stats':'invalid input data'})

    return Response({'stats':serializer.data})
票数 2
EN

Stack Overflow用户

发布于 2015-11-11 13:28:23

这已经得到了回答,但我也在寻找一种解决方案,用于实现而不是,通过使用getlist从请求中获取值来改革序列化程序数据(否则,关键是什么)。

如果您使用ListField (可能也使用many=True),那么其中有处理列表的代码,问题是您在客户端上使用jQuery,这似乎会导致"ids[]“语法的混乱。

Here是我想要使用的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2017-04-13 07:35:33

但是,我希望避免使用代码手动从查询参数中提取这些值,并将其再次传递给序列化程序。我以为序列化器会帮我这么做。-萨蒂什

我也希望序列化器能帮我做到这一点,但我还没有找到它。此外,我使用了query_params的django-filter列表:MultipleChoiceFilterModelMultipleChoiceFilter,所以DRF ListField不会对我起作用。

在我的项目中,Android请求没有[],但只有带[]的IOS请求。

我的解决方案是添加一个装饰器,以在request.query_paramsrequest.data中添加数据。

代码语言:javascript
运行
复制
def update_get_list_params(func):
    def wraps(self, request, *args, **kwargs):
        request.query_params._mutable = True
        request.data._mutable = True
        for key in list(request.query_params.keys()):
            # Make sure you know this will not influence the other query_params
            if key.endswith('[]'):
                new_key = key.split('[]')[0]
                value = request.query_params.getlist(key)
                if value:
                    request.query_params.setlist(new_key, value)
        for key in list(request.data.keys()):
            if key.endswith('[]'):
                new_key = key.split('[]')[0]
                value = request.data.getlist(key)
                if value:
                    request.data.setlist(new_key, value)
        return func(self, request, *args, **kwargs)
    return wraps


@update_get_list_params
def get(self, request, *args, **kwargs):
     pass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31083467

复制
相关文章

相似问题

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