代码之家  ›  专栏  ›  技术社区  ›  Franco

序列化程序返回对象字段

  •  2
  • Franco  · 技术社区  · 6 年前

    我接收的是DRF输出的模型对象,而不是实际的字段。

    我想接收音频链接和发布艺术家表的所有项目。

    这是我有的。

    输出

    { "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)" ] }

    型号.py

    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'
    

    视图.py

    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
                )
    

    序列化程序.py

    class ReleasesSerializer(serializers.ModelSerializer):
        audiolinks = serializers.StringRelatedField(many=True)
        releaseartists = serializers.StringRelatedField(many=True)
    
        class Meta:
            model = ReleasesAll
            fields = ('title','audiolinks','releaseartists')
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Sreekanth Reddy Balne    6 年前

    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惯例,你需要用单数形式命名模型,即, AudioLink , ReleaseArtist audiolinks 你可能会想“有很多AudioLink对象,而我得到的却很少”