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.
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
Un peu tard mais réponse courte. Essaye ça
user_count = serializers.IntegerField(
source='user_set.count',
read_only=True
)
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.