Search code examples
django-modelsdjango-rest-frameworkdjango-serializer

Count the no of movies in django rest framework


I want to count the no of movies worked by the actors in api. i have tried this but not working models.py

class Actor(models.Model):
    actors = models.CharField(max_length=100)

class Genre(models.Model):
    genre = models.CharField(max_length=100)
    
class Movie(models.Model):
    name = models.CharField(max_length=100)
    actors = models.ManyToManyField(Actor, related_name="actor_movies")
    genre = models.ManyToManyField(Genre,related_name="genre_movies")

serializers.py

class ActorSerializer(serializers.HyperlinkedModelSerializer):
    actor_movies = serializers.RelatedField(source='actor.movies', read_only = True)
    class Meta:
        model = Actor
        fields = ['id','actors','actor_movies']

class GenreSerializer(serializers.HyperlinkedModelSerializer):
    genre_movies = serializers.RelatedField(source='genre.names', read_only = True)
    class Meta:
        model = Genre
        fields = ['id','genre','genre_movies']

class MovieSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Movie
        fields = ['url','name','actors','genre']

im getting output like this

[
    {
        "id": 1,
        "genre": "Ajith"
    },
    {
        "id": 2,
        "genre": "Vijay"
    }
]

in actual output i need the total no of movies he worked also.


Solution

  • You can use a SerializerMethodField:

    class ActorSerializer(serializers.HyperlinkedModelSerializer):
        count_actor_movies= serializers.SerializerMethodField()
    
        def get_count_actor_movies(self, instance):
            return instance.actor_movies.count()
    
        class Meta:
            model = Actor
            fields = ['id','actors','count_actor_movies']
    

    For more details, the official docs are here.