Обновить вложенный сериализатор перезаписанным to_representation - PullRequest
0 голосов
/ 03 июля 2019

Контекст

Итак, у меня есть 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. Кажется, именно то, что мне нужно.

1 Ответ

1 голос
/ 03 июля 2019

в функции обновления вы:

  • пытаетесь зациклить словарь как список
  • , используя update_or_create, это приведет к созданию дублированных дорожек

Вот исправленный код ошибки: *

def update(self, instance, validated_data):
    for trackid, track in validated_data['tracks'].items():
        obj = Track.objects.filter(id = trackid)
        if obj:
            obj[0].album_id = track['album_id']
            obj[0].order = track['order']
            obj[0].title = title= track['title']
            obj[0].save()
        else:
            Track.objects.create(
                album_id= track['album_id'],
                order=track['order'],  
                title= track['title'])
    return instance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...