问题
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.
回答1:
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
回答2:
A bit late but short answer. Try this
user_count = serializers.IntegerField(
source='user_set.count',
read_only=True
)
回答3:
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.
来源:https://stackoverflow.com/questions/33345089/add-a-count-field-to-a-django-rest-framework-serializer