【问题标题】:Django REST-framework: Using serializer for simple ForeignKey-relationshipDjango REST 框架:使用序列化程序实现简单的外键关系
【发布时间】:2018-08-05 03:50:34
【问题描述】:

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

Using reverse relationships with django-rest-framework's serializer

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

在序列化程序 AlbumSerializer 上尝试获取字段 album_name 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 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)

序列化器:

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')

查看:

class TrackView(viewsets.ModelViewSet):
    queryset = Track.objects.all().select_related('album')
    serializer_class = serializers.TrackSerializer

到目前为止我所尝试的:

  1. 使用反向关系将具有相关曲目的专辑序列化为嵌套序列化程序 => 有效
  2. 只为没有嵌套专辑的 TrackSerializer 做这项工作 => works
  3. 只为 AlbumSerializer 做这项工作 => 作品
  4. 使用 TrackSerializer,如代码部分所示,但将 AlbumSerializer 减少每个 除了主键 'id' => works 之外的字段(但我需要 整个专辑数据集)
  5. 通过设置 many=True 将嵌套的序列化程序更改为多关系。 => 转储,因为框架试图迭代 AlbumSerializer 的所有字段。

由于我没有足够的想法和材料来浏览,所以我在问这个问题: 关于我的示例,如何为每个曲目列出专辑的所有或单个属性(!= PrimaryKey)。

【问题讨论】:

    标签: django django-rest-framework foreign-keys serialization


    【解决方案1】:

    Track 模型中的album_id 只是专辑的主键,所以你有int 输入错误描述。您需要使用album 字段而不是album_id 来指定整个album 对象:

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

    【讨论】:

    • 非常非常感谢@neverwalkaloner,解决了我的(看起来很简单,但我花了好几个小时进行故障排除...)的问题!
    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多