2015-10-26 15 views
11

Sto serializzando il modello del gruppo django incorporato e vorrei aggiungere un campo al serializzatore che conta il numero di utenti nel gruppo. Attualmente sto usando il seguente serializzatore:Aggiungere un campo count a un serializzatore django rest framework

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

Questo restituisce l'ID del gruppo e il nome e una serie di utenti (user ID) nel gruppo:

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

Quello che vorrei, invece, come l'uscita è qualcosa come:

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

Qualsiasi aiuto sarebbe apprezzato. Grazie.

risposta

16

Questo dovrebbe funzionare

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

Questo aggiunge un campo user_count al serializzatore il cui valore viene fissato dal get_user_count, che restituirà la lunghezza del user_set.

Potete trovare ulteriori informazioni su SerializerMethodField qui: http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

+1

Grazie, funziona come un fascino. Dovevo solo cambiare "obj.user_set" in "obj.user_set.all()" –

+2

forse obj.user_set.count() o qualcosa del genere –

+0

Questa risposta è molto utile quando si utilizza la mongoengine e non sono disponibili relazioni inverse. – Wtower

25

un po 'tardi, ma risposta breve. Prova questo

user_count = serializers.IntegerField(
    source='user_set.count', 
    read_only=True 
) 
+0

incredibile, grazie !!! – molecular

+5

Risposta stupenda. . . . funzionerà anche 'user_count = serializers.ReadOnlyField ( source = 'user_set.count' )' –

+0

È possibile filtrare anche user_set? qualcosa come: 'serializers.IntegerField (source = 'user_set.count', read_only = True, filters = {'user_set.x': 'y'})' – Sassan

Problemi correlati