困惑于Django Rest中的Serializer关系

时间:2016-07-16 09:18:48

标签: django-rest-framework

在Django官方网站的Serializer关系部分,它提供了一个音乐专辑示例来表示和解释一些关系。

class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)

class Track(models.Model):
    album = models.ForeignKey(Album, related_name='tracks')
    order = models.IntegerField()
    title = models.CharField(max_length=100)
    duration = models.IntegerField()

    class Meta:
        unique_together = ('album', 'order')
        ordering = ['order']

    def __unicode__(self):
        return '%d: %s' % (self.order, self.title) 

稍后,它会将模型与Serializer进行交互。

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.StringRelatedField(many=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

结果是:

{
    'album_name': 'Things We Lost In The Fire',
    'artist': 'Low',
    'tracks': [
        '1: Sunflower',
        '2: Whitetail',
        '3: Dinosaur Act',
        ...
    ]
}

我对AlbumSerializer中的可变曲目感到困惑。似乎可变曲目与专辑和曲目模型无关。它与专辑和曲目模型有何关系?如何在AlbumSerializer中调用和调用Track模型的 unicode 方法?

1 个答案:

答案 0 :(得分:1)

通过related_name

相关
album = models.ForeignKey(Album, related_name='tracks')

related_name属性指定从专辑到曲目的反向关系的名称。

了解更多https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.ForeignKey.related_name