11

DjangoRESTFrameworkを使用する次のシリアライザーがあります。

これは私がこれまでに持っているものです...

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)このコードのいずれかをモデルに含める必要がありますか?モデルに追加しようとしましたが、引数を渡すことができます。

models.py すなわちメソッドクラス

     def get_score(self, profile):

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

2 に答える 2

22

シリアライザーには、ビューインスタンスを含むコンテキストディクショナリが渡されるため、次のようにしてprofile_idを取得できます。

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

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

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

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

于 2013-02-17T14:00:32.200 に答える
7

トムの回答に対するジェイソンの質問応答に回答するには、同じコンテキストメカニズムを介してリクエストオブジェクトにアクセスできます。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))
于 2015-01-08T04:12:17.733 に答える