Add a count field to a django rest framework serializer

Question:

I am serializing the built-in django Group model and would like to add a field to the serializer that counts the number of users in the group. I am currently using the following serializer:

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ('id', 'name', 'user_set')

This returns the group ID and name and an array of users (user IDs) in the group:

{
    "id": 3,
    "name": "Test1",
    "user_set": [
      9
    ]
}

What I would like instead as output is something like:

{
    "id": 3,
    "name": "Test1",
    "user_count": 1
}

Any help would be appreciated. Thanks.

Asked By: David Brown

||

Answers:

This should work

class GroupSerializer(serializers.ModelSerializer):

    user_count = serializers.SerializerMethodField()

    class Meta:
        model = Group
        fields = ('id', 'name','user_count')

    def get_user_count(self, obj):
        return obj.user_set.count()

This adds a user_count field to your serializer whose value is set by get_user_count, which will return the length of the user_set.

You can find more information on SerializerMethodField here: http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

Answered By: emre.

A bit late but short answer. Try this

user_count = serializers.IntegerField(
    source='user_set.count', 
    read_only=True
)
Answered By: Lal

Everyone’s answer looks great. And I would like to contribute another options here – to use @property if-and-only-if you can modify the target model.

Assume you can modify the Group model.

class Group(models.Model):

    @property
    def user_count(self):
        return self.user_set.count

Then you can simply add 'user_count' to fields in your serializer.

I’m using this approach but I’m thinking to switch to the serializer approach as other’s answer here. Thanks everyone.

Answered By: John Pang
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.