2015-01-14 7 views
22

モデルシリアライザで現在のユーザを取得できますか?私はジェネリック医薬品から枝分かれすることなくそうしたいと思っています。そうしなければならない単純な作業ですから。モデルシリアライザで現在のユーザを取得

マイモデル:

class Activity(models.Model): 
    number = models.PositiveIntegerField(
     blank=True, null=True, help_text="Activity number. For record keeping only.") 
    instructions = models.TextField() 
    difficulty = models.ForeignKey(Difficulty) 
    categories = models.ManyToManyField(Category) 
    boosters = models.ManyToManyField(Booster) 

    class Meta(): 
     verbose_name_plural = "Activities" 

マイシリアライザ:

class ActivitySerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Activity 

そして、私の意見:私は、このようなこと追加フィールドuserで、モデルが返さ取得できますか

class ActivityDetail(generics.RetrieveUpdateDestroyAPIView): 

    queryset = Activity.objects.all() 
    serializer_class = ActivityDetailSerializer 

私の反応は次のようになります:

{ 
    "id": 1, 
    "difficulty": 1, 
    "categories": [ 
     1 
    ], 
    "boosters": [ 
     1 
    ], 
    "current_user": 1 //Current authenticated user here 
} 

答えて

30

私はDjangorestframeworkのソースコードを通して答えを見つけました。

class ActivitySerializer(serializers.ModelSerializer): 

    # Create a custom method field 
    current_user = serializers.SerializerMethodField('_user') 

    # Use this method for the custom field 
    def _user(self, obj): 
     user = self.context['request'].user 
     return user 

    class Meta: 
     model = Activity 
     # Add our custom method to the fields of the serializer 
     fields = ('id','current_user') 

キーは、ModelSerializer内部に定義されたメソッドは、常に(一方が認証されたユーザを含む)の要求を含む、独自のコンテキストへのアクセスを持っているという事実です。私のアクセス許可は認証されたユーザーのみに適用されるため、常にここに何かがあるはずです。

これは、他のビルトインのdjangorestframeworkシリアライザでも行うことができます。

+0

どのようにその変数にアクセスしますか?私は同様に私を設定しているが、create()メソッドでは変数にアクセスできないようだ。リクエストにも含まれていません.POST。 – Craig

+0

Iをコード上に使用されるが、次のエラーを_user ユーザ= self.contextで ファイル "/Users/abc/abc/Django/Work/abc/abc/src/MadhaparGamApps/serializers/newsfeedSerializer.py"、ライン21を与えます[Request '] user KeyError:' request ' –

+1

リクエストを受け取ったすべてのユーザーKeyError:これは、次のようにリクエストオブジェクトでビューからシリアライザを初期化することによって解決できます。serializer = serializers.RandomSerializer(data = request.data、context = {'request':request}) ソース:http://www.django-rest-framework.org/api-guide/serializers/#saving-instances –

13

コンテキストは、デフォルトでリクエストを含むRESTフレームワークでシリアライザに渡されます。したがって、シリアライザの内部でself.context['request'].userを使用することができます。

関連する問題