Django rest framework serializing many to many field Django rest framework serializing many to many field python python

Django rest framework serializing many to many field


You will need a TagSerializer, whose class Meta has model = Tag. After TagSerializer is created, modify the PostSerializer with many=True for a ManyToManyField relation:

class PostSerializer(serializers.ModelSerializer):    tag = TagSerializer(read_only=True, many=True)    class Meta:        model = Post        fields = ('tag', 'text',)

Answer is for DRF 3


This is what I did, let´s suppose a Book can have more than one author and an Author can have more than one book:On Model:

class Author(models.Model):    name = models.CharField(max_length=100, default="")    last_name = models.IntegerField(default=0)class Book(models.Model):    authors = models.ManyToManyField(Author, related_name="book_list", blank=True)    name = models.CharField(max_length=100, default="")    published = models.BooleanField(default=True)

On Serializers:

class BookSerializer(serializers.ModelSerializer):    authors = serializers.PrimaryKeyRelatedField(queryset=Author.objects.all(), many=True)    class Meta:        model = Book        fields = ('id', 'name', 'published', 'authors')class AuthorSerializer(serializers.ModelSerializer):    book_list = BookSerializer(many=True, read_only=True)    class Meta:        model = Author        fields = ('id', 'name', 'last_name', 'book_list')


Adding to @Brian's answer"tags": [{"name": "tag1"}] can be simplified to "tags": ["tag1", "tag2",...] in this way:

class PostSerializer(serializers.ModelSerializer):    tag = TagSerializer(read_only=True, many=True)    class Meta:        ...class TagSerializer(serializers.RelatedField):     def to_representation(self, value):         return value.name     class Meta:        model = Tag

More info here: https://www.django-rest-framework.org/api-guide/relations/#custom-relational-fields