Сериализация нескольких полей API в одно.Джанго - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть предопределенный 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".

Любые идеи, как я могу иметь вложенный сериализатор, который имеет доступ ко всем даннымв запросе?

Спасибо

Джои

...