У меня есть предопределенный API, например:
{
time : some_time,
height : {1: 154, 2: 300, 3: 24},
color : {1: 'red', 2: 'blue', 3: 'green'},
age : {1: 27, 2: 324, 3: 1},
... many, many more keys.
}
У меня нет контроля над этим API, поэтому я не могу изменить его структуру.
Каждый целочисленный ключ в под словаряхсвязаны и часть одной записи.Например, объект, имеющий рост 154, также имеет цвет: красный и возраст: 27.
Я знаю одну стратегию для работы с этим, чтобы иметь отдельные сериализаторы для каждого поля.
class MySerializer(serializers.ModelSerializer):
# Nested serializers
height = HeightSerializer()
colour = ColourSerializer()
age = AgeSerializer()
etc, etc, etc
Но это все равно дает мне беспорядочные данные для работы, что требует большого количества логики update () в сериализаторе.
Вместо этого я хочу иметь один вложенный сериализатор, который имеет доступ к полному запросуданные и могут работать с высотой, цветом и возрастом одновременно и возвращать мне что-то вроде метода to_internal_value ():
{
['record' : 1, 'height': 154, 'colour' : 'red', 'age' : 27],
['record' : 2, 'height': 300, 'colour' : 'blue', 'age' : 324],
['record' : 3, 'height': 24, 'colour' : 'green', 'age' : 2],
}
Но, к сожалению, сериализатор высоты, кажется, имеет доступ только к информации в полях, называемых высотой.Я знаю, что могу использовать user source = "foo" в вызове init , но тогда он имеет доступ только к полю, называемому "foo".Я хочу, чтобы он имел доступ ко всем полям.
Я заметил, что есть опция source = '*', но она не работает.Мой init метод сериализатора никогда не вызывается, если в вызове API нет ключа "height".
Любые идеи, как я могу иметь вложенный сериализатор, который имеет доступ ко всем даннымв запросе?
Спасибо
Джои