Search code examples
djangodjango-rest-frameworkdjango-viewsdjango-serializer

add instances to a manytomany field in django rest framework


I have a very simple question and I'm surprised it hasn't been asked before on this website. I have the two following models:

# models.py
class Film(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=150)
    genre = models.ManyToManyField(Genre)

class Genre(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, unique=True)

I need to make an API that gets 2 integers, id of movie and id of genre, and adds the said genre to the movie. seems very simple but I don't know how I could do this. I could really use the help.


Solution

  • You might want this:

    class GenreSerializer(serializers.ModelSerializer):
            class Meta:
                model = Genre
                fields = ('name', 'id')
    
    
    class FilmSerializer(serializers.ModelSerializer):
        genre = GenreSerializer(many=True, read_only=False)
    
        class Meta:
            model = Film
            fields = ('name', 'id', 'genre')
    
        def update(self, instance, validated_data):
            genres_data = validated_data.pop('genre')
            instance = super(FilmSerializer, self).update(instance, validated_data)
    
            for genre_data in genres_data:
                genre_qs = Genre.objects.filter(name__iexact=genre_data['name'])
    
                if genre_qs.exists():
                    genre = genre_qs.first()
                else:
                    genre = Genre.objects.create(**genre_data)
    
                instance.genre.add(genre)
    
            return instance