【问题标题】:How to add an array object to nested object in Django?如何将数组对象添加到 Django 中的嵌套对象?
【发布时间】:2021-04-24 15:43:38
【问题描述】:

我需要将一个对象数组添加到另一个结构如下所示的对象中。

这是专辑的当前回复:

[
  {
    "id": "1",
    "name": "Skin",
    "artists": [
      {
        "id": "1",
        "name": "Flume",
      }
    ],
    "tracks": [
      {
        "id": "1",
        "name": "Take A Chance"
      }
    ]
  }
]

我需要将专辑响应中的 tracks 对象转换为:

[
  {
    "id": "1",
    "name": "Skin",
    "artists": [
      {
        "id": "1",
        "name": "Flume",
      }
    ],
    "tracks": {
      "items": [
        {
          "id": "1",
          "name": "Take A Chance"
        }
      ]
    }
  }
]

编辑:这是我当前的模型、视图和序列化程序:

class Artist(models.Model):
    name = models.CharField(max_length=300)
    albums = models.ManyToManyField('albums.Album', related_name='artists')
    tracks = models.ManyToManyField('tracks.Track', related_name='artists')


class Album(models.Model):
    name = models.CharField(max_length=400)


class Track(models.Model):
    name = models.CharField(max_length=400)
    album = models.ForeignKey('albums.Album', related_name='tracks', on_delete=models.CASCADE)

#views.py
class AlbumAPIView(RetrieveAPIView):
    queryset = Album.objects.all()
    serializer_class = AlbumsSerializer
    lookup_field = 'id'

#serializers.py
class AlbumsSerializer(serializers.ModelSerializer):
    artists = ArtistsSerializer(many=True)
    tracks = TrackSerializer(many=True)

    class Meta:
        model = Album
        fields = [
            'id',
            'name',
            'artists',
            'tracks',
        ]

class ArtistsSerializer(serializers.ModelSerializer):

    class Meta:
        model = Artist
        fields = [
            'id',
            'name',
        ]

class TrackSerializer(serializers.ModelSerializer):
    artists = ArtistsSerializer(many=True)

    class Meta:
        model = Track
        fields = [
            'id',
            'name',
            'artists',
        ]

UPD:添加了序列化程序和视图!

任何帮助将不胜感激。

【问题讨论】:

  • 显示创建响应的视图 - DRF 序列化程序/原始响应?
  • @monio 原谅我的无知,暂时无法添加,但现在更新了序列化程序和视图文件!

标签: django django-rest-framework


【解决方案1】:

你可以这样做:

class AlbumsSerializer(serializers.ModelSerializer):
    artists = ArtistsSerializer(many=True)
    tracks = serializers.SerializerMethodField()
    
    def get_tracks(self, obj):
        serializer = TrackSerializer(obj.tracks, many=True)
        return {'items' : serializer.data}

    class Meta:
        model = Album
        fields = [
            'id',
            'name',
            'artists',
            'tracks',
        ]

【讨论】:

  • 我用serializer = TrackSerializer(obj.tracks, many=True) 更新了get_tracks 方法中的serializer 变量,它成功了!我想接受你的回答,但请更新它
  • 答案已更新,但使用source='obj.tracks' 也应该可以工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 2017-12-08
  • 2021-01-05
相关资源
最近更新 更多