我正在构建一个REST API来处理以下形式的用户请求:
localhost:8000/search/?categories=<category1>,<category2>&parts=<id1>,<id2>
其中,
应该是解析器的分隔符。
我的视图处理请求并将查询参数传递给序列化程序,但我无法将原始字符串解析为字符串列表。
到目前为止我的尝试:
class StringListField(serializers.ListField):
child = serializers.CharField()
class LookupPartsSerializer(serializers.Serializer):
categories = StringListField()
parts = StringListField()
class LookupParts(APIView):
def get(self, request, format=None):
serializer = LookupPartsSerializer(data=request.query_params)
serializer.is_valid()
return Response(serializer.validated_data)
我想要的输出如下:
{
"categories": [
"<category1>",
"<category2>"
],
"parts": [
"<id1>",
"<id2>"
]
}
但现在我得到了:
{
"categories": [
"<category1>,<category2>"
],
"parts": [
"<id1>,<id2>"
]
}
所以基本上我正在寻找一个选项来将分隔符参数传递给StringListField
或添加一些自定义解析方法。
我知道,如果我将查询模式从?categories=<category1>,<category2>...
更改为?categories=<category1>&categories=<category2>...
,那么我会得到所需的结果,但我想坚持原来的方法。
答案 0 :(得分:1)
我认为最好的方法是实施客户to_representation()
:
def to_representation(self, instance):
data = super(StringListField, self).to_representation(instance)
data['parts'] = data['parts'].split(',') if isinstance(data['parts'], str) else data['parts']
data['categories'] = data['categories'].split(',') if isinstance(data['categories'], str) else data['categories']
return data
希望它有所帮助!