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.
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
A bit late but short answer. Try this
user_count = serializers.IntegerField(
source='user_set.count',
read_only=True
)
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.
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.
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
A bit late but short answer. Try this
user_count = serializers.IntegerField(
source='user_set.count',
read_only=True
)
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.