web-dev-qa-db-fra.com

Ajouter un champ de comptage à un sérialiseur d'infrastructure de repos Django

Je suis en train de sérialiser le modèle de groupe Django intégré et je voudrais ajouter un champ au sérialiseur qui compte le nombre d'utilisateurs du groupe. J'utilise actuellement le sérialiseur suivant:

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

Cela renvoie l'ID et le nom du groupe, ainsi qu'un tableau d'utilisateurs (ID utilisateur) du groupe:

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

Ce que je voudrais plutôt comme sortie est quelque chose comme:

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

Toute aide serait appréciée. Merci.

18
David Brown

Cela devrait marcher

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()

Ceci ajoute un champ user_count à votre sérialiseur dont la valeur est définie par get_user_count, ce qui renverra la longueur du user_set.

Vous pouvez trouver plus d'informations sur SerializerMethodField ici: http://www.Django-rest-framework.org/api-guide/fields/#serializermethodfield

23
emre.

Un peu tard mais réponse courte. Essaye ça

user_count = serializers.IntegerField(
    source='user_set.count', 
    read_only=True
)
38
Lal Zada

La réponse de tout le monde est superbe. Et j'aimerais apporter une autre option ici: utiliser @property si-et-seulement-si vous pouvez modifier le modèle cible.

Supposons que vous puissiez modifier le modèle Group.

class Group(models.Model):

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

Ensuite, vous pouvez simplement ajouter 'user_count' à fields dans votre sérialiseur.

J'utilise cette approche mais je pense passer à l'approche du sérialiseur comme réponse de l'autre ici. Merci tout le monde.

0
John Pang