简体   繁体   English

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

[英]Issues with Serializer in Django-Rest-Framework

I wanted to create serializer for my model who have nested relationship.My models looks like this : 我想为具有嵌套关系的模型创建序列化器。我的模型如下所示:

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

And My serializer : 和我的序列化器:

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

And I am using this trackSerializer in my views . 在我trackSerializer ,我正在使用这个trackSerializer but when in browser I am getting nothing means no fields or data just blank json . 但是当在浏览器中我什么也没得到时就意味着没有字段或数据只是空白json。

I am confused how to handle this nested relationships in serlaizer so that my end API works fine. 我很困惑如何在serlaizer中处理此嵌套关系,以使我的最终API正常工作。

You defined your trackSerializer in wrong way. 您以错误的方式定义了trackSerializer

Track model doesn't have track_parent or track_child attributes. Track模型没有track_parenttrack_child属性。 They belong to Album model. 它们属于Album模型。 Remember that related_name is an attribute to defined how your pointed model, in this case Album may retrieve their backwards model instances aka Track instances. 请记住, related_name是用于定义指针模型的属性,在这种情况下, Album可能会检索其向后模型实例(也称为Track实例)。 related_name does not rename the attribute as you think it does. related_name不会像您认为的那样重命名该属性。

Also, track_parent represents Track instances, you can't serializer a Track instance using albumSerializer 另外, 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')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM