python - 使用 DRF 序列化程序验证包含动态键的嵌套字典

标签 python django django-rest-framework

我正在为现有 API 编写序列化程序,以便为项目自动生成 OpenAPI 文档。我遇到的问题之一是定义序列化程序以验证从某些 View 返回的数据。
下面是数据的结构:

{
    "airmass_data": {
        "site-A": {
            "times": ["2021-09-09T09:54","2021-09-09T10:04"],
            "airmasses": [2.900041850251779, 2.687634707193725]
        },
        "site-B": {
            "times": ["2021-09-09T09:54","2021-09-09T10:04"],
            "airmasses": [2.900041850251779, 2.687634707193725]
        },
                ...
    },
    "airmass_limit": 3.19
}
可以有任意数量的“site-X”键,它们是动态生成的——这绝对是我的问题的一部分。
以下是我设置序列化程序的方式,我认为这主要与我的字典结构相匹配:
class SiteAirmassDatumSerializer(serializers.Serializer):
    times = serializers.ListField(child=serializers.CharField())
    airmasses = serializers.ListField(child=serializers.FloatField())


class SiteAirmassSerializer(serializers.Serializer):
    site = SiteAirmassDatumSerializer(source='*')


class AirmassSerializer(serializers.Serializer):
    airmass_data = SiteAirmassSerializer(source='*')
    airmass_limit = serializers.FloatField()
但是,当将我的字典传递给序列化程序并尝试对其进行验证时,serializer.errors 属性具有:
{
  "airmass_data": {
    "site": [
      "This field is required."
    ]
  }
}
有没有一种好方法来编写一组序列化程序来处理动态生成的 key ?我主要是想写这个来验证返回字典的一般结构 - 不一定是其中的键。我对使用序列化程序感兴趣的原因是利用 DRF 的 OpenAPI 生成功能。
编辑:
也试过使用 DictField在序列化程序中,像这样:
class SiteAirmassDatumSerializer(serializers.Serializer):
    times = serializers.ListField(child=serializers.CharField())
    airmasses = serializers.ListField(child=serializers.FloatField())


class SiteAirmassSerializer(serializers.Serializer):
    site = DictField(child=SiteAirmassDatumSerializer(), source='*')


class AirmassSerializer(serializers.Serializer):
    airmass_data = DictField(child=SiteAirmassSerializer(), source='*')
    airmass_limit = serializers.FloatField()
尝试验证上述结构时,出现以下错误:
{
  "airmass_data": {
    "site-A": {
      "site": [
        "This field is required."
      ]
    }
  }
}

最佳答案

我建议更改您的数据结构并使用列表而不是字典:

{
"airmass_data": [
     {
        "site_name": "site-A"
        "times": ["2021-09-09T09:54","2021-09-09T10:04"],
        "airmasses": [2.900041850251779, 2.687634707193725]
    },
    {
        "site_name": "site-B"
        "times": ["2021-09-09T09:54","2021-09-09T10:04"],
        "airmasses": [2.900041850251779, 2.687634707193725]
    },
            ...
],
"airmass_limit": 3.19
}

关于python - 使用 DRF 序列化程序验证包含动态键的嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68960370/

相关文章:

python - 使用 Django 模型中的 URLField 链接到外部站点

Python 3打印到文件创建错误的新行

python - 在 Python __init__ 方法中使用异步等待

python - Django Rest API urlsplit错误

jquery - 如何在 django 中创建嵌套多选树

API 级别的 Django 组和权限(使用 django-rest-framework)

python - Django Rest Framework - View 集和覆盖方法以允许多种形式的查找值

python - 在 Django Rest Framework 中为每个 View 定义分页 page_size

python - 使用 Pandas 中其他行的排列生成新行

python - 对嵌套函数运行单元测试