如何在Django休息框架中检索外键字段?

时间:2017-06-01 07:39:53

标签: django serialization django-rest-framework

鉴于下面的模型和序列化程序类,当我检索Track详细信息时,它将仅显示Track标题,但不显示相关的Artist。

在检索曲目详细信息时,如何显示艺术家姓名?

models.py

class Artist (models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Track (models.Model):    
    artist = models.ForeignKey(Artist, blank=True, null=True, on_delete=models.SET_NULL, verbose_name="Artist")
    title = models.CharField(max_length=100, verbose_name="Title")

    def __str__(self):
        return self.title

serializers.py

class ArtistSerializer(serializers.ModelSerializer):

    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField()

    class Meta:
        model = Artist
        fields = ('id', 'name')

class TrackSerializer(serializers.ModelSerializer):

    class Meta:
        model = Track
        fields = '__all__'

4 个答案:

答案 0 :(得分:4)

我认为您需要自定义字段,请尝试使用此序列化程序:

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ('title', 'artist','artist_name')

    artist_name = serializers.SerializerMethodField('get_artists_name')

    def get_artists_name(self, obj):
        return obj.artist.name

它产生这样的东西。

[
    {
        "title": "Don't let me down",
        "artist": 2,
        "artist_name": "The Beatles"
    },
    {
        "title": "Summertime",
        "artist": 1,
        "artist_name": "Ella Fitzgerald"
    }
]

最好的问候。

答案 1 :(得分:3)

正如您在官方django休息框架documentations中看到的那样 您应该为嵌套项定义序列化器字段

首先创建您的Artist(嵌套项目)序列化程序

class ArtistSerializer(serializers.ModelSerializer):

    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField()

    class Meta:
        model = Artist
        fields = ('id', 'name')

然后您可以在相关的模型序列化器上使用它

class TrackSerializer(serializers.ModelSerializer):
    artist = ArtistSerializer()

    class Meta:
        model = Track
        fields = ('title', 'artist')

答案 2 :(得分:2)

试试这个序列化程序,

class ArtistSerializer(serializers.ModelSerializer):

    class Meta:
        model = Artist
        fields = '__all__'

class TrackSerializer(serializers.ModelSerializer):
    artist = ArtistSerializer()

    class Meta:
        model = Track
        fields = ('title', 'artist')

为了检索Artist详细信息,这是一个ForeignKey模型,您需要在django-rest-framework中使用嵌套的序列化器。

通过将TrackSerializer与嵌套的ArtistSerializer一起使用,检索到的数据看起来像这样,

{
    "title": "Some_Title",
    "artist": {
                   "id": 2, #or id of the artist.
                   "name": "Artist_name"
               }
}

答案 3 :(得分:0)

在当前版本的DRF中,您只需执行此操作

class TrackSerializer(serializers.ModelSerializer):
    
    artist = serializers.StringRelatedField()

    class Meta:
        model = Track
        fields = '__all__'

StringRelatedField可用于通过其__str__方法表示关系的目标。

REF