Контекст
Итак, у меня есть AlbumSerializer
с вложенным TrackSerializer
. Для удобства в интерфейсе я перезаписываю представление AlbumSerializer
, чтобы создать словарь треков вместо списка.
class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ('id', 'order', 'title')
# directly upsert tracks
def create(self, validated_data):
obj, created = Track.objects.update_or_create(
album_id= validated_data['album_id'],
order=validated_data['order'],
defaults={'title': validated_data['title']}
)
return obj
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True)
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
# make a dictionary of the tracks
def to_representation(self, instance):
representation = super().to_representation(instance)
representation['tracks'] = {track['id']: track for track in representation['tracks']}
return representation
#update tracks with the album endpoint
def update(self, instance, validated_data):
for track in validated_data['tracks']
obj, created = Track.objects.update_or_create(
album_id= track['album_id'],
order=track['order'],
defaults={'title': track['title']}
)
return instance
Проблема
Теперь, когда я пытаюсь обновить альбом, включая некоторые названия треков, я получаю Expected a list of items but got type \"dict\"
. Что имеет смысл.
Вопрос
Как я могу заставить DRF принимать словари вместо списка, если дорожки?
Обновление: Только что узнали о drf-rw-serializers
. Кажется, именно то, что мне нужно.