2016-07-09 30 views
5
class MyModelSerializer(serializers.ModelSerializer): 
    field1 = serializers.CharField() 
    field2 = serializers.SerializerMethodField('get_awesome_user') 

    def get_current_user(self): 
     request = self.context.get("request") 
     if request and hasattr(request, "user"): 
      return request.user 
     return None 

    def get_awesome_user(self, obj): 
     user = self.get_current_user() 
     ## use this user object, do some stuff and return the value 
     return ... 

私のAPIを持っていませんが(authentication_classespermission_classesを使用する)このシリアライザを使用しているとget_current_user関数は常にNoneを返します。デバッグするとself.contextが空の辞書、つまり{}であることがわかりました。確かに私はself.context.keys()を印刷しましたが、まだそれは空リストです。Djangoの残りのフレームワーク - self.contextが要求属性

このスレッドに従いました。

Get current user in Model Serializer

PS:私はdjangorestframework==3.3.3Django==1.9.1

EDIT使用しています:追加ビューセットのコード

class MyModelViewSet(viewsets.ModelViewSet): 

    authentication_classes = (SessionAuthentication, BasicAuthentication, TokenAuthentication) 
    permission_classes = (IsAuthenticated,) 

    def list(self, *args, **kwargs): 
     queryset = MyModel.objects.all() 
     page = self.paginate_queryset(queryset) 
     if page is not None: 
      serializer = MyModelSerializer(page, many=True) 
      return self.get_paginated_response(serializer.data) 

     serializer = MyModelSerializer(queryset, many=True) 
     return Response(serializer.data) 
+0

通常、self.contextはgenerics.py:GenericApiVie 'によって満たされています'viewset.list()/ detail()/ create()/ delete()の先頭で呼び出される' generics.py:GenericApiView.get_serializer() 'によって呼び出されるw.get_serializer_context )/ update() 'を実行します。 ViewSetコードを提供することができますか?あなたが何をしようとしているのかを理解する必要があるためですか? –

+0

@Bob:問題のビューセットコードを追加しました。plzが見ています。 – Wendy

+0

遅れて申し訳ありません。ウェンディ、「#何か」はあまり説明しない。ビューセットの 'list()'メソッドでシリアライザをどのように作成しますか?シリアライザのコンテキストを自動的に取得するには、 'serializer = self.get_serializer(data = request.data)'を呼び出すべきですが、 'serializer = MyModelSerializer(instance)'のように手動で作成していると思います。 'serializer = MyModelSerializer(instance、context = {'request':request、...})'のように、 'get_serializer()'を呼び出すか、シリアライズのコンストラクタに余分なコンテキスト引数を渡す必要があります。 –

答えて

11

をどのようにあなたのビューセットのlist()方法でシリアライザを作成するのですか? 。あなたはそれがdefault implementation of this method in DRF mixinsに行われるように、あなたのシリアライザのコンテキストが自動的に満たさ取得する

serializer = self.get_serializer(data=request.data) 

を呼び出す必要がありますが、私はあなただけでこのように、それを手動で作成している感があります。

serializer = MyModelSerializer(instance) 

ので、 、この問題を解決するために、あなたはget_serializer()を呼び出す、またはシリアライザのコンストラクタに追加のコンテキスト引数を渡す必要があり、次のいずれか

serializer = MyModelSerializer(instance, context={'request': request, ...}) 
+0

ありがとう!あなたの提案は働いた:) – Wendy

+0

@Wendy素晴らしい!がんばろう。 –

関連する問題