首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用覆盖的to_representation更新嵌套序列化程序

用覆盖的to_representation更新嵌套序列化程序
EN

Stack Overflow用户
提问于 2019-07-03 10:46:42
回答 1查看 970关注 0票数 0

上下文

所以我有一个AlbumSerializer和一个嵌套的TrackSerializer。为了在前面方便起见,我重写了AlbumSerializer的表示,使它成为一个曲目字典,而不是一个列表。

代码语言:javascript
复制
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。似乎正是我所需要的。

EN

回答 1

Stack Overflow用户

发布于 2019-07-03 11:34:56

在update功能中,您是:

  • 试图像列表一样循环字典
  • 使用update_or_create,这将导致创建重复的轨道。

以下是一个错误的固定代码::

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56868385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档