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.