Django REST框架:使用序列化程序实现简单的ForeignKey关系

mol*_*son 4 django foreign-keys serializer django-rest-framework

我正在使用Django REST框架,并尝试映射一个简单的外键关系以提供相关数据以供进一步使用,类似于以下请求:

将反向关系与Django-rest-framework的序列化器一起使用

我收到以下异常,而不是结果:

尝试获取album_name序列化程序中字段的值时出现AttributeError AlbumSerializer。序列化程序字段的名称可能不正确,并且与int实例上的任何属性或键都不匹配。原始异常文本为:'int'对象没有属性'album_name'。

楷模:

    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', on_delete=models.CASCADE)
        album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
        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)
Run Code Online (Sandbox Code Playgroud)

序列化器:

class AlbumSerializer(serializers.ModelSerializer):
    class Meta:
        model = Album
        fields = ('id', 'album_name', 'artist' )
class TrackSerializer(serializers.ModelSerializer):
    album_id = AlbumSerializer(many=False, read_only=True)
    class Meta:
        model = Track
        fields = ('order', 'title', 'duration', 'album_id')
Run Code Online (Sandbox Code Playgroud)

视图:

class TrackView(viewsets.ModelViewSet):
    queryset = Track.objects.all().select_related('album')
    serializer_class = serializers.TrackSerializer
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的是:

  1. 使用反向关系将具有相关曲目的专辑作为嵌套序列化器序列化=> 可以
  2. 仅为没有嵌套专辑=>的TrackSerializer进行工作
  3. 仅为AlbumSerializer => 工作
  4. 使用代码部分中所示的TrackSerializer,但除主键'id'=>之外的每个字段都减少AlbumSerializer的工作(但我需要专辑的整个数据集)
  5. 通过设置many = True将嵌套的序列化器更改为多关系。=>转储,因为框架尝试在AlbumSerializer的所有字段上进行迭代。

由于我没有足够的想法和材料来浏览,所以我问一个问题:关于示例,如何列出每个Track的Album的全部或单个属性(!= PrimaryKey)。

nev*_*ner 5

album_idTrack模型中只是专辑的主键,因此您需要int输入错误描述。您需要album通过使用albumfield而不是指定整个对象album_id

class TrackSerializer(serializers.ModelSerializer):
    album = AlbumSerializer(many=False, read_only=True)
    class Meta:
        model = Track
        fields = ('order', 'title', 'duration', 'album')
Run Code Online (Sandbox Code Playgroud)