如何在Django Rest Framework序列化器中序列化布尔值列表?
解决DRF序列化布尔值列表的正确方法
我来帮你搞定这个DRF序列化的问题,你之前的尝试其实已经踩对了方向,只是几个小细节没处理到位,下面给你两种靠谱的解决方案:
方法一:直接使用ListField搭配child参数(推荐)
这是最简洁且原生支持的方式,你之前错误地在ListField里定义了子字段day,正确的做法是通过child参数指定列表中每个元素的类型:
from rest_framework import serializers class HistorySerializer(serializers.Serializer): days = serializers.ListField(child=serializers.BooleanField())
这样序列化出来的结果就是你想要的格式:
"days": [True, True, False, True, False, False, False]
而且Swagger会自动识别这是布尔值数组类型,不会再显示成单个布尔值。
方法二:如果需要自定义逻辑,用SerializerMethodField并指定输出类型
如果你需要根据对象的其他属性动态生成days列表,就得用SerializerMethodField,但要手动指定它的输出schema,这样Swagger才能正确识别类型:
原生DRF实现
from rest_framework import serializers from typing import List class HistorySerializer(serializers.Serializer): days = serializers.SerializerMethodField() def get_days(self, obj) -> List[bool]: # 这里可以写你的自定义逻辑,比如从obj的其他字段生成days列表 return obj.days # 手动指定字段的输出类型,让Swagger识别为布尔值数组 days.field = serializers.ListField(child=serializers.BooleanField())
如果你用drf-spectacular增强Swagger文档
可以用extend_schema_field装饰器更优雅地指定类型:
from rest_framework import serializers from drf_spectacular.utils import extend_schema_field from typing import List class HistorySerializer(serializers.Serializer): @extend_schema_field(serializers.ListField(child=serializers.BooleanField())) def get_days(self, obj) -> List[bool]: return obj.days days = serializers.SerializerMethodField()
为什么你之前的尝试会出问题?
BooleanField本身就是单个布尔值的字段,不支持many=True参数,这个参数是给关联模型字段(比如ForeignKey)用的,不是基础数据类型字段的配置项。- 你之前写的
DaysListField里定义了day = serializers.BooleanField(),这相当于告诉DRF:列表里的每个元素是一个包含day键的字典,所以序列化后才会得到[{"day": True}, ...]的格式,而不是单纯的布尔值列表。 SerializerMethodField默认不会自动推断输出类型,所以Swagger只能默认显示成单个布尔值,必须手动指定输出的schema才能让它识别为数组。
内容的提问来源于stack exchange,提问作者ratumba
相关产品推荐
相关产品推荐

