如何在DRF序列化器中解析字符串列表查询参数?

时间:2018-01-20 13:01:49

标签: django python-3.x django-rest-framework query-parameters

我正在构建一个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>...,那么我会得到所需的结果,但我想坚持原来的方法。

1 个答案:

答案 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

希望它有所帮助!