Add a count field to a django rest framework serializer

我们两清 提交于 2019-12-20 11:22:47

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!