简体   繁体   中英

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 . but when in browser I am getting nothing means no fields or data just blank json .

I am confused how to handle this nested relationships in serlaizer so that my end API works fine.

You defined your trackSerializer in wrong way.

Track model doesn't have track_parent or track_child attributes. They belong to Album model. 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 does not rename the attribute as you think it does.

Also, track_parent represents Track instances, you can't serializer a Track instance using albumSerializer

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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