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

bay*_*man 5 django serialization django-rest-framework

鉴于下面的模型和序列化程序类,当我检索Track细节时,它只会显示Track标题,但不会显示相关的Artist.

在检索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
Run Code Online (Sandbox Code Playgroud)

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__'
Run Code Online (Sandbox Code Playgroud)

zai*_*zil 11

试试这个序列化器,

class ArtistSerializer(serializers.ModelSerializer):

    class Meta:
        model = Artist
        fields = '__all__' # or array of fieldnames like ['name_1', 'name_2']

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

    class Meta:
        model = Track
        fields = ('title', 'artist')
Run Code Online (Sandbox Code Playgroud)

为了检索艺术家详细信息,这是一个外键模型,您需要在 django-rest-framework 中使用嵌套的序列化程序。

通过将 TrackSerializer 与嵌套的 ArtistSerializer 一起使用,检索到的数据将如下所示,

{
    "title": "Some_Title",
    "artist": {
                   "id": 2, #or id of the artist.
                   "name": "Artist_name"
               }
}
Run Code Online (Sandbox Code Playgroud)


Ser*_* M. 6

我认为你需要自定义字段,试试这个序列化器:

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
Run Code Online (Sandbox Code Playgroud)

它产生这样的东西.

[
    {
        "title": "Don't let me down",
        "artist": 2,
        "artist_name": "The Beatles"
    },
    {
        "title": "Summertime",
        "artist": 1,
        "artist_name": "Ella Fitzgerald"
    }
]
Run Code Online (Sandbox Code Playgroud)

最好的祝福.