Django-Rest-Framework 中的序列化程序问题

Posted

技术标签:

【中文标题】Django-Rest-Framework 中的序列化程序问题【英文标题】:Issues with Serializer in Django-Rest-Framework 【发布时间】:2015-03-13 07:38:47 【问题描述】:

我想为具有嵌套关系的模型创建序列化程序。我的模型如下所示:

class Master(models.Model):
    en = models.TextField('English')

class Album(models.Model):
    pk_album = models.AutoField(primary_key=True, serialize=True)
    title = models.OneToOneField(Master, related_name='Album_title')
    description = models.OneToOneField(Master, related_name='Album_description')


class Track(models.Model):
    pk_track = models.AutoField(primary_key=True)
    fk_album_parent = models.ForeignKey('Album', related_name='track_parent')
    fk_album_child = models.ForeignKey('Album', related_name='track_child')

还有我的序列化器:

class masterSerializer(serializers.ModelSerializer):
    class Meta:
        model = Master
        fields = ('en',)

class albumSerializer(serializers.ModelSerializer):
    album_title = masterSerializer()
    album_description = masterSerializer()

    class Meta:
        model = Album
        fields = ('album_title', 'album_description')

class trackSerializer(serializers.ModelSerializer):
    track_parent = albumSerializer(many=True, read_only=True)
    track_child = albumSerializer(many=True, read_only=True)

    class Meta:
        model = Track
        fields = ('track_parent', 'track_child')

我在我的观点中使用这个trackSerializer。但是在浏览器中我什么也没有得到意味着没有字段或数据只是空白 json。

我很困惑如何在 serlaizer 中处理这种嵌套关系,以便我的最终 API 可以正常工作。

【问题讨论】:

【参考方案1】:

您以错误的方式定义了您的trackSerializer

Track 模型没有 track_parenttrack_child 属性。它们属于Album 模型。请记住,related_name 是一个属性,用于定义指向模型的方式,在这种情况下,Album 可以检索它们的反向模型实例,也就是 Track 实例。 related_name 不会像您认为的那样重命名属性。

另外,track_parent 代表Track 实例,您不能使用albumSerializer 序列化Track 实例

class trackSerializer(serializers.ModelSerializer):

    class Meta:
        model = Track
        fields = ('pk_track',)


class albumSerializer(serializers.ModelSerializer):
    album_title = masterSerializer()
    album_description = masterSerializer()
    track_parent = trackSerializer(many=True, read_only=True)
    track_child = trackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ('album_title', 'album_description','track_parent', 'track_child')

【讨论】:

这里track_parent = albumSerializer(many=True, read_only=True)albumSerializer可以叫自己吗??它不会给出未定义的错误吗? @n.imp 是的,抱歉,我修好了。 但它给出了未定义的错误,Adjacency_parent = albumSerializer(many=True, read_only=True) NameError: name 'albumSerializer' is not defined @n.imp 我修好了,检查我的答案,应该是 trackSerializer 而不是 albumSerializer 是的,它有效,最后一个问题。 API 响应必须包含所有 fields (album_title, album_description etc),但我的响应仅包含 pk_track,因为它是 trackSerializer 中提到的唯一字段

以上是关于Django-Rest-Framework 中的序列化程序问题的主要内容,如果未能解决你的问题,请参考以下文章

Django-Rest-Framework 中的序列化程序问题

如何更改 django-rest-framework 的 authtoken 中的现有令牌?

将 django-rest-framework 中的超链接添加到 ModelViewSet

如何从 django-rest-framework 中的文件列表中过滤图像

如何处理 django-rest-framework 中 url 模式中的外键关系

django-rest-framework 序列化器在多个视图中的不同字段