尝试使用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"
}
}
我是否以不正确的方式发送输入参数?我错过了一些琐碎的东西吗?
谢谢!
发布于 2015-06-27 05:19:40
为同一密钥发送多个参数的标准方法是使用相同的密钥名两次。
你可以这样做:
/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})
发布于 2015-11-11 13:28:23
这已经得到了回答,但我也在寻找一种解决方案,用于实现而不是,通过使用getlist从请求中获取值来改革序列化程序数据(否则,关键是什么)。
如果您使用ListField (可能也使用many=True),那么其中有处理列表的代码,问题是您在客户端上使用jQuery,这似乎会导致"ids[]“语法的混乱。
Here是我想要使用的解决方案。
发布于 2017-04-13 07:35:33
但是,我希望避免使用代码手动从查询参数中提取这些值,并将其再次传递给序列化程序。我以为序列化器会帮我这么做。-萨蒂什
我也希望序列化器能帮我做到这一点,但我还没有找到它。此外,我使用了query_params的django-filter
列表:MultipleChoiceFilter
和ModelMultipleChoiceFilter
,所以DRF ListField不会对我起作用。
在我的项目中,Android请求没有[]
,但只有带[]
的IOS请求。
我的解决方案是添加一个装饰器,以在request.query_params
和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
https://stackoverflow.com/questions/31083467
复制相似问题