2013-02-17 6 views
8

私はDjango REST Frameworkを使用して以下のシリアライザを持っています。これは私がこれまで持っているものであるRest Frameworkシリアライザメソッド

...

serializer.py

class ProductSerializer(serializers.ModelSerializer): 

    score = serializers.SerializerMethodField('get_this_score') 

    class Meta: 
     model = Product 
     fields = ('id', 'title', 'active', 'score') 

    def get_this_score(self, obj): 

     profile = Profile.objects.get(pk=19) 
     score = [val for val in obj.attribute_answers.all() if val in profile.attribute_answers.all()] 
     return (len(score)) 

このスニペットを持ついくつかの問題がありますurls.py

url(r'^products/(?P<profile_id>.+)/$', ProductListScore.as_view(), name='product-list-score'), 

コードの

1)pram pk = 19はハードコードされています。self.kwargs['profile_id'].私は試してみましたが、kwargをメソッドに渡す方法がわからず、profile_idを動作させることができません。つまり、私はURLから取得できません。

2)このコードのいずれかをモデルにする必要がありますか?モデルに追加しようとしましたが、やはりargsを渡すことができます。

models.py すなわちメソッドクラスあなたはこのような何かを行うことによってPROFILE_IDを得ることができるよう

 def get_score(self, profile): 

     score = [val for val in self.attribute_answers.all() if val in 
profile.attribute_answers.all()] 
      return len(score) 

答えて

21

シリアライザは、ビューのインスタンスを含むコンテキスト辞書を、渡されます。

view = self.context['view'] 
profile_id = int(view.kwargs['profile_id']) 

しかし、この場合、「obj」はいずれの場合もプロファイルインスタンスに設定されるため、これを行う必要はないと思います。

はい、代わりにモデルクラスに 'get_this_score'メソッドを配置することができます。あなたはまだ 'SerializerMethodField'が必要ですが、単純に 'return obj.get_this_score(...)'を呼び出し、シリアライザコンテキストから引数を設定します。

シリアライザのコンテキストには 'request'も含まれるため、必要に応じて 'request.user'にアクセスすることもできます。

+1

私はモデルでこれを持っているというアイデアが気に入っています。 SerializerMethodField source =を使用すると、私はparmsを渡すことができません。 SerializerMethodFieldを使用し、要求argsとオブジェクトをモデルメソッドに渡す例を私に教えてください。これは本当に私を理解するのに役立ちます。ありがとうございます。 – jason

+0

私は@jason –

+0

の質問に参加しています。しかし、この場合、「obj」はどのような場合でもプロファイルインスタンスに設定されるため、あなたはそれを行う必要はないと思います。 – Pynchia

7

Tomの回答に対するjasonの質問への回答には、同様のコンテキストメカニズムを使用してリクエストオブジェクトにアクセスできます。 ModelMethod定義から要求オブジェクトを参照し、それらを渡すことはありません。私はこれを使用して現在のrequest.userオブジェクトにアクセスすることができました。

class ProductSerializer(serializers.ModelSerializer): 
    score = serializers.SerializerMethodField('get_this_score') 

    class Meta: 
     model = Product 
     fields = ('id', 'title', 'active', 'score') 

    def get_this_score(self, obj): 

     profile = self.context['request'].user 
     score = [val for val in obj.attribute_answers.all() if val in profile.attribute_answers.all()] 
     return (len(score)) 
+0

おかげで、あなたのソリューションは私の仕事です! –

+0

私はこのシリアライザをCBVで使用していますが、このシリアライザをFBVで使用したときに返されました({'data':ProductSerializer(many = True).data}) 'keyerror request –

+0

が解決しました。 [余分な文脈を含む](http://www.django-rest-framework.org/api-guide/serializers/#including-extra-context) –

関連する問題