Как получить значение вложенного поля сериализатора из его родительского класса сериализатора?

Рассмотрим следующие два сериализатора:

class SerializerA(BaseSerializer):
    field_1 = serializers.IntegerField()
    field_2 = SerializerB()

class SerializerB(BaseSerializer):
    field_3 = serializers.IntegerField()

Входной JSON для SerializerB не будет содержать поле_3, и оно должно быть получено из поля_1 SerializerA.

Я пробовал это

class SerializerB(BaseSerializer):
    field_3 = serializers.IntegerField()

    def __init__(self, instance=None, data=empty, **kwargs):
        if data is not empty and isinstance(data, dict):
            _data = data.copy()
            _data['field_3'] = self.parent.initial_data.get('field_1')
            super(SerializerB, self).__init__(instance, _data, **kwargs)

        super(SerializerB, self).__init__(instance, data, **kwargs)

Но это не работает, так как данные всегда пустые и никогда не проходит оператор if.

Вложенная десериализация с возможностью записи не поддерживается из коробки в Django Rest, вам нужно написать свои собственные методы создания/обновления: документация, поэтому я думаю, что фреймворк даже не делегирует data дочерним (вложенным) сериализаторам при инициализации.

Другое соображение заключается в том, что атрибут parent вложенного сериализатора (SerializerB) является None в __init__, он получает значение только в методе bind вложенного сериализатора. Поэтому, если вы хотите использовать конструкцию self.parent.initial_data.get(), вам нужно сделать это в методе bind в SerializerB

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