Как получить значение вложенного поля сериализатора из его родительского класса сериализатора?
Рассмотрим следующие два сериализатора:
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