You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

解决DRF中逗号分隔查询参数转列表的问题

你遇到的问题是DRF默认的ListField只会处理多参数形式(比如?categories=cat1&categories=cat2),不会自动解析单个参数里的逗号分隔字符串。我们可以通过自定义字段来实现需求,既保留原有URL模式,又能得到期望的列表格式。

自定义分隔符列表字段

继承DRF的ListField,重写to_internal_value方法来处理逗号分隔的字符串:

from rest_framework import serializers

class DelimitedListField(serializers.ListField):
    def __init__(self, delimiter=',', **kwargs):
        # 允许自定义分隔符,默认用逗号
        self.delimiter = delimiter
        super().__init__(**kwargs)

    def to_internal_value(self, data):
        # 如果输入是字符串,按分隔符分割成列表
        if isinstance(data, str):
            # 可选:过滤空字符串和仅含空格的元素
            data = [item.strip() for item in data.split(self.delimiter) if item.strip()]
        # 交给父类处理列表的验证逻辑
        return super().to_internal_value(data)

在序列化器中使用自定义字段

把原来的StringListField替换成我们的DelimitedListField即可:

class LookupPartsSerializer(serializers.Serializer):
    categories = DelimitedListField(child=serializers.CharField())
    parts = DelimitedListField(child=serializers.CharField())

测试效果

现在当你发送请求localhost:8000/search/?categories=category1,category2&parts=id1,id2时,序列化后的validated_data就会是你期望的格式:

{
  "categories": ["category1", "category2"],
  "parts": ["id1", "id2"]
}

额外优化说明

如果需要处理其他分隔符(比如分号),只需要在字段初始化时指定delimiter参数即可:

categories = DelimitedListField(delimiter=';', child=serializers.CharField())

这样就完美解决了你的问题,不用修改现有的URL查询模式,同时实现了逗号分隔字符串到列表的解析。

内容的提问来源于stack exchange,提问作者Szabolcs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:41:37