使用DRF Serializers验证包含动态键的嵌套字典
解决方案
你之前的错误是多定义了不必要的嵌套序列化层,同时滥用了source='*'参数导致序列化器尝试读取不存在的字段。DRF的DictField天生支持动态键场景,其child参数可直接指定字典中所有值的统一校验规则,不需要关心键的具体名称和数量。
正确序列化器代码
class SiteAirmassDatumSerializer(serializers.Serializer): times = serializers.ListField(child=serializers.CharField()) airmasses = serializers.ListField(child=serializers.FloatField()) class AirmassSerializer(serializers.Serializer): # DictField的child参数指定字典所有值的校验结构,自动适配任意动态键 airmass_data = serializers.DictField(child=SiteAirmassDatumSerializer()) airmass_limit = serializers.FloatField()
特性说明
- 校验逻辑完全匹配你的需求:仅验证
airmass_data为字典,且字典下每个值都包含符合格式的times和airmasses字段,不限制动态site键的数量和名称 - 完美适配DRF的OpenAPI生成能力:生成的Schema会自动将
airmass_data定义为additionalProperties指向SiteAirmassDatumSerializer结构的对象,完全符合OpenAPI规范对动态键字典的定义。
内容的提问来源于stack exchange,提问作者Matt Daily
相关产品推荐
相关产品推荐

