2015-10-26 14 views
11

私は組み込みのdjangoグループモデルをシリアライズしており、グループ内のユーザ数をカウントするシリアライザにフィールドを追加したいと考えています。これは、グループIDと名前やグループ内のユーザーの配列(ユーザーID)を返しdjango restフレームワークシリアライザにcountフィールドを追加

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

::私は現在、次のシリアライザを使用していますが出力されるよう

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

私が代わりたいと思いますどのような次のようなものがあります。

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

助けてください。ありがとう。

答えて

16

これはこれはuser_setの長さを返します。その値get_user_countによって設定されているあなたのシリアライザにuser_countフィールドを追加し

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

動作するはずです。

あなたはここに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

この回答は、mongoengineが使用され、逆の関係が利用できない場合に非常に便利です。 – Wtower

25

少し遅れたが、短い答えを。試してみてください

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

素晴らしい、ありがとう! – molecular

+5

恐ろしい答え。 。 。 。 'user_count = serializers.ReadOnlyField( source = 'user_set.count' )' –

+0

user_setもフィルタリングできますか? 'serializers.IntegerField(source = 'user_set.count'、read_only = True、filters = {'user_set.x': 'y'})' – Sassan

関連する問題