尝试使用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"
}
}
我是否以错误的方式发送输入参数?我错过了一些微不足道的事吗?
谢谢!
答案 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)
但是我想避免代码手动从查询参数中提取这些值并将其再次传递给序列化程序。我期待序列化器为我做这件事。 - 萨蒂什
我也希望序列化程序为我做这个,但我还没有找到它。此外,我使用MultipleChoiceFilter
:ModelMultipleChoiceFilter
和[]
的query_params列表,因此DRF ListField对我不起作用。
在我的项目中,Android请求没有[]
,但只有request.query_params
的IOS请求。
我的解决方案是添加装饰器以在request.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
中添加数据。
<local:ViewSecurityCF Grid.Column="1" Grid.Row="0"/>