2015-10-26 12 views
11

पर एक गिनती फ़ील्ड जोड़ें I अंतर्निहित डीजेंगो समूह मॉडल को क्रमबद्ध कर रहा हूं और समूह में उपयोगकर्ताओं की संख्या की गणना करने वाले धारावाहिक में एक फ़ील्ड जोड़ना चाहता हूं।एक django rest framework serializer

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

यह रिटर्न समूह आईडी और नाम और समूह के उपयोगकर्ताओं की एक सरणी (उपयोगकर्ता ID):: मैं वर्तमान में निम्नलिखित serializer उपयोग कर रहा हूँ

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

मैं बजाय चाहते हैं क्या के रूप में उत्पादन होता है कुछ ऐसा:

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

किसी भी मदद की सराहना की जाएगी। धन्यवाद।

उत्तर

16

यह

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

काम करना चाहिए यह आपके serializer जिसका मूल्य get_user_count द्वारा निर्धारित है, जो user_set की लंबाई वापस आ जाएगी करने के लिए एक user_count क्षेत्र कहते हैं।

आप SerializerMethodField यहां पर अधिक जानकारी प्राप्त कर सकते हैं: http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

+1

धन्यवाद, एक आकर्षण की तरह काम करता है। बस "obj.user_set" को "obj.user_set.all()" –

+2

"obj.user_set.count() या कुछ –

+0

में बदलना था, यह उत्तर बहुत उपयोगी है जब मोंगोएन्गिन का उपयोग किया जाता है और रिवर्स रिश्तों उपलब्ध नहीं होते हैं। – Wtower

25

थोड़ा देर से लेकिन संक्षिप्त उत्तर। इस

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

अद्भुत, धन्यवाद !!! – molecular

+5

बहुत बढ़िया जवाब। । । । यह 'user_count = serializers.ReadOnlyField ( स्रोत = 'user_set.count' )' –

+0

भी उपयोगकर्ता_सेट को फ़िल्टर करना संभव है? कुछ ऐसा: 'serializers.IntegerField (स्रोत =' user_set.count ', read_only = True, filter = {' user_set.x ':' y '}) ' – Sassan