如何在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
相关产品推荐
相关产品推荐

