Кажется, вы пытаетесь реализовать записываемые вложенные сериализаторы. Хотя вложенные сериализаторы по умолчанию доступны только для чтения, в DRF есть раздел, в котором объясняется, как реализовать записываемые: https://www.django-rest-framework.org/api-guide/relations/#writable -nested-сериализаторы
Поскольку вы хотите, чтобы TrackListingField
сериализовать модель Track
, которую она должна наследовать от ModelSerializer
:
class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ['order', 'name', 'duration']
Затем вам придется переопределить метод create
для AlbumSerializer
:
def create(self, validated_data):
tracks_data = validated_data.pop('tracks')
album = Album.objects.create(**validated_data)
for track_data in tracks_data:
Track.objects.create(album=album, **track_data)
return album
Пожалуйста обратите внимание, что выше будет делать один запрос к базе данных на трек. Вы можете использовать Track.objects.bulk_create
, чтобы сделать только один запрос для создания всех треков.
Чтобы ответить на ваш первоначальный вопрос о to_internal_value
, вы можете увидеть, что по умолчанию, добавив этот оператор print
в переопределено to_internal_value
:
class TrackSerializer(serializers.ModelSerializer):
...
def to_internal_value(self, data):
default_return_value = super(TrackSerializer, self).to_internal_value(data)
print(default_return_value)
return default_return_value
В случае ModelSerializer
DRF использует вывод OrderedDict
для to_internal_value
. Ваш пользовательский to_internal_value
должен извлечь order
, name
и duration
из строки data
, используя регулярное выражение, и поместить их в OrderedDict
. Однако в этом случае, вероятно, было бы проще использовать словарь для представления треков.