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_parent
或 track_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 中的文件列表中过滤图像