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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:14:59