序列化程序返回对象而不是字段

Posted

技术标签:

【中文标题】序列化程序返回对象而不是字段【英文标题】:Serializer returns object instead fields 【发布时间】:2019-02-20 17:22:23 【问题描述】:

使用 Django 2.1/Django Rest 框架。

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

我想收到 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.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'

views.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
            )

serializers.py

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

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

【问题讨论】:

【参考方案1】:

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 对象,而我得到的却很少”

【讨论】:

谢谢,这行得通。是否有一个快捷方式可以从 ReleasesSerializer 类中的 ReleaseAll 中输出所有字段,而不是手动输入它们?相当于`fields = ('all','audiolinks','releaseartists') 没有。 ("__all__") 仅单独工作,包括模型字段,相关字段除外。因此,如果您也想包含相关字段,则必须单独添加它们。这里没有解决方法。

以上是关于序列化程序返回对象而不是字段的主要内容,如果未能解决你的问题,请参考以下文章

关于fastjson在序列化成JSON串时字段增加的问题

提供“ManyRelatedManager”对象的列表字段序列化程序不是 M2M 字段的可迭代错误

Django:有没有办法序列化模型字段而不是模型?

使用 Jackson 反序列化:获取 Json 对象设置的字段列表

让springboot序列化空值null为"null"而不是空报文体(jackson)

序列化指针本身而不是目标对象