Serializer返回对象而不是字段

问题描述 投票:2回答:1

使用Django 2.1 / Django Rest Framework。

我从DRF而不是实际字段接收Model对象输出。

我想收到audio_links和release_artists表的所有项目。

这就是我所拥有的。

产量

{ "title": "Attack The Dancefloor Volume Two", "audiolinks": [ "AudioLinks object (55708)", "AudioLinks object (55709)", "AudioLinks object (55710)", "AudioLinks object (55711)" ], "releaseartists": [ "ReleaseArtists object (140)", "ReleaseArtists object (141)" ] }

models.朋友

class AudioLinks(models.Model):
    release = models.ForeignKey('ReleasesAll', models.DO_NOTHING, db_column='release_id', related_name='audiolinks')
    track_number = models.IntegerField()
    class Meta:
        managed = False
        db_table = 'audio_links'

class ReleaseArtists(models.Model):
    release = models.ForeignKey('ReleasesAll', models.DO_NOTHING, db_column='release_id', related_name='releaseartists')
    artists = models.CharField(max_length=100)

    class Meta:
        managed = False
        db_table = 'release_artists'

views.朋友

class ListReleaseDetailView(generics.RetrieveUpdateDestroyAPIView):

    queryset = ReleasesAll.objects.all()
    serializer_class = ReleasesSerializer
    def get(self, request, *args, **kwargs):
        try:
            a_release = self.queryset.prefetch_related('releaseartists','audiolinks').get(pk=kwargs['release_id'])
            return Response(ReleasesSerializer(a_release).data)

        except ReleasesAll.DoesNotExist:
            return Response(
                data = {
                    "message": "{} does not exist".format(kwargs["release_id"])
                },
                status=status.HTTP_404_NOT_FOUND
            )

serialize认识.朋友

class ReleasesSerializer(serializers.ModelSerializer):
    audiolinks = serializers.StringRelatedField(many=True)
    releaseartists = serializers.StringRelatedField(many=True)

    class Meta:
        model = ReleasesAll
        fields = ('title','audiolinks','releaseartists')
django django-models django-rest-framework django-views django-serializer
1个回答
4
投票

serializers.stringRelatedField给出了模型中定义的__str__方法的输出。

因此,你得到这个“AudioLinks object (55708)”和ReleaseArtists object (141),这是任何模型的默认__str__表示。

要获取所有字段,必须为与所需字段相关的每个其他模型定义序列化程序,如下所示:

class AudioLinksSerializer(serializers.ModelSerializer):
    class Meta:
        model = AudioLinks
        fields = ('__all__')

class ReleaseArtistsSerializer(serializers.ModelSerializer):
    audiolinks = serializers.StringRelatedField(many=True)
    releaseartists = serializers.StringRelatedField(many=True)

    class Meta:
        model = ReleaseArtists
        fields = ('__all__')

然后:

class ReleasesSerializer(serializers.ModelSerializer):
    audiolinks = AudioLinksSerializer(many=True)
    releaseartists = ReleaseArtistsSerializer(many=True)

    class Meta:
        model = ReleasesAll
        fields = ('title','audiolinks','releaseartists')

这足以让你获得所有领域。

***并且从Django惯例开始,您需要将模型命名为单数形式,即AudioLinkReleaseArtist。这样您就可以将模型视为单个对象。当你试图获得audiolinks时会更容易,因为你会想到“有很多AudioLink对象而且我得到的很少”

© www.soinside.com 2019 - 2024. All rights reserved.