How to get count of objects from ManyToManyField in Django?

Question:

I have a User and Event model,

class User(AbstractUser):
    bio = models.CharField(max_length=255, blank=False, default='')

class Event(models.Model):
    name    = models.CharField(max_length=50)
    user    = models.ManyToManyField("User", related_name='event_player')

I want to get the number of users registered in events, I tried the following ways:

Try 1

class EventSerializer(serializers.ModelSerializer):

    players_count = serializers.IntegerField(
        source='user_set.count', 
        read_only=True
    )

    class Meta:
        model = Event
        fields = ('id', 'name','players_count')

Try 2

class EventSerializer(serializers.ModelSerializer):

    players_count = serializers.SerializerMethodField()

    class Meta:
        model = Event
        fields = ('id', 'name','players_count')

    def get_players_count(self, obj):
        return obj.user_set.all().count()

Try 3

class EventSerializer(serializers.ModelSerializer):

    def to_representation(self, instance):
        return {'id': instance.pk, 'players_count': instance.user__count}
        
    class Meta:
        model = Event
        fields = ('id', 'name','players_count')

But none of them make a sense, how do I get the total count of nested ManyToMany Users. I’m new to DRF please help me to solve this.

Asked By: Sumithran

||

Answers:

Try 2 should work without _set
See Django ManyToMany Docs for more information

class EventSerializer(serializers.ModelSerializer):

    players_count = serializers.SerializerMethodField()

    class Meta:
        model = Event
        fields = ('id', 'name','players_count')

    def get_players_count(self, obj):
        return obj.user.all().count()
Answered By: ChrisRob