Проверка вложенных словарей, содержащих динамические ключи, с помощью сериализаторов 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
}