Django的DRF ListField反序列化GET的queryparams ID列表(Djang

2019-10-23 13:21发布

试图用DRF的ListField选项反序列化的查询参数值(在下面的示例应用程序)的列表。 我无法使其工作。 无法与在网上找到的例子。 希望有人扔一些帮助。

API: /getAppStats/?applications=one,two,three

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})

我看到的是这样的 -

 {
            "stats": {
                "applications": [],
                "start_date": "2015-05-27",
                "end_date": "2015-06-26"
            }
        }

我是否在发送不正确的方法输入PARAMS? 我错过了什么小事?

谢谢!

Answer 1:

该标准的方法来发送多个参数同样关键的是要使用相同的密钥名称两次。

你可以这样做:

/getAppStats/?applications=one&applications=two&applications=three

此外,您的服务器将获得应用,即作为一个数组applications[]而不是applications

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})


Answer 2:

这已经回答了,但我也一直在寻找涉及通过获取值出具有的GetList请求重整串行数据的解决方案(否则有什么意义)。

如果您使用ListField(或许,如果你还使用许多= TRUE)有在那里的代码将处理名单,问题是,它看起来像你这似乎引起了“IDS [在客户端上使用jQuery] “语法,败坏了序列化。

这里是我使用了该解决方案。



Answer 3:

但我想,以避免代码查询手动PARAMS拉这些值,并再次把它传递给串行器。 我期待串行为我做的。 - 萨蒂什

我也想串行为我做到这一点,但我还没有找到它。 再说,我使用query_params名单django-filterMultipleChoiceFilterModelMultipleChoiceFilter ,所以DRF ListField不会为我工作。

在我的项目,而Android的请求[]但是只有IOS要求[]

我的解决办法是增加一个装饰中添加数据request.query_paramsrequest.data

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


文章来源: Django DRF ListField to deserialize list of ids in GET's queryparams