如何使用Django Serializers序列化含动态键嵌套结构的请求数据?
Django REST Framework 处理动态键字典的序列化方案
不用完全手动序列化,DRF提供了DictField结合自定义序列化类的方式就能处理这种动态键的结构,下面是具体实现步骤:
1. 定义街道信息序列化类
先为单条街道的详细字段创建序列化类:
from rest_framework import serializers class StreetDetailSerializer(serializers.Serializer): streetNumberStart = serializers.IntegerField() streetNumberEnd = serializers.IntegerField() houses = serializers.IntegerField()
2. 定义城市数据序列化类
用DRF的DictField处理streets这个动态键字典,通过child参数指定每条街道对应的序列化类:
class CitySerializer(serializers.Serializer): cityName = serializers.CharField() population = serializers.IntegerField() streets = serializers.DictField(child=StreetDetailSerializer())
3. 实际使用示例
反序列化(处理传入的请求数据)
# 模拟外部传入的请求数据 request_data = { "cityName": "Some name", "population": 5, "streets": { "theBestStreetName": { "streetNumberStart": 1, "streetNumberEnd": 200, "houses": 5000 }, "theWorstStreetName": { "streetNumberStart": 1, "streetNumberEnd": 7, "houses": 4 } } } serializer = CitySerializer(data=request_data) if serializer.is_valid(): validated_data = serializer.validated_data # 这里可以对验证后的数据做后续处理,比如存入数据库
序列化(输出结构化数据)
如果要将已有数据序列化为指定格式,直接调用serializer.data即可:
# 假设已有验证后的城市数据 serializer = CitySerializer(validated_data) print(serializer.data) # 输出会保留原有的动态街道名键结构
补充说明
如果需要将数据存入Django模型,可在序列化类的create或update方法中,手动处理streets字段的存储逻辑,比如拆分街道数据为关联模型的实例。
内容的提问来源于stack exchange,提问作者Anders Breid
相关产品推荐
相关产品推荐

