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