Django DRF ListField在GET的查询文件中反序列化id列表

时间:2015-06-26 23:12:37

标签: django rest get django-rest-framework

尝试使用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"
            }
        }

我是否以错误的方式发送输入参数?我错过了一些微不足道的事吗?

谢谢!

3 个答案:

答案 0 :(得分: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})

答案 1 :(得分:1)

这已得到解答,但我也在寻找一种解决方案涉及通过getlist从请求中获取值来改进序列化数据(否则,重点是什么) 。

如果你使用ListField(也可能使用 many = True ),那里有代码可以处理列表,问题是看起来你正在使用jQuery客户似乎导致" ids []"语法会破坏序列化程序。

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

答案 2 :(得分:0)

  

但是我想避免代码手动从查询参数中提取这些值并将其再次传递给序列化程序。我期待序列化器为我做这件事。 - 萨蒂什

我也希望序列化程序为我做这个,但我还没有找到它。此外,我使用MultipleChoiceFilterModelMultipleChoiceFilter[]的query_params列表,因此DRF ListField对我不起作用。

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

我的解决方案是添加装饰器以在request.datadef 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 中添加数据。

<local:ViewSecurityCF Grid.Column="1" Grid.Row="0"/>