Проверка вложенных словарей, содержащих динамические ключи, с помощью сериализаторов DRF

Я работаю над написанием сериализаторов для существующего API с целью автоматической генерации документации OpenAPI для проекта. Одна из проблем, с которой я столкнулся, заключается в определении сериализаторов для проверки возвращаемых данных из некоторых представлений.

Здесь представлена структура данных:

{
    "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."
    ]
  }
}

Есть ли хороший способ написать набор сериализаторов так, чтобы он работал с динамически генерируемыми ключами? Я в основном пытаюсь написать это для проверки общей структуры возвращаемого словаря - не обязательно ключей в нем. Причина, по которой я заинтересован в использовании сериализаторов, заключается в использовании возможностей DRF по генерации OpenAPI.

Я предлагаю изменить структуру данных и использовать список вместо dict:

{
"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

}

Вернуться на верх