web-dev-qa-db-ja.com

Django RESTフレームワーク-self.contextにはリクエスト属性がありません

_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_classes_および_permission_classes_を使用)はこのシリアライザーを使用しており、_get_current_user_関数は常にNoneを返します。デバッグしたところ、self.contextが空の辞書、つまり_{}_であることがわかりました。念のため、私もself.context.keys()を出力しましたが、それでも空のリストです。

私はこのスレッドをフォローしました。

モデルシリアライザーで現在のユーザーを取得

PS:私は_djangorestframework==3.3.3_、_Django==1.9.1_を使用しています

編集:ビューセットコードの追加

_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)
_
16
Wendy

ビューセットのlist()メソッドでシリアライザをどのように作成しますか?あなたは電話する必要があります

_serializer = self.get_serializer(data=request.data)
_

DRF mixinsでのこのメソッドのデフォルト実装 。で行われるように、シリアライザコンテキストを自動的に入力しますが、次のように手動で作成しているように感じます。

_serializer = MyModelSerializer(instance)
_

したがって、これを修正するには、get_serializer()を呼び出すか、追加のコンテキスト引数をシリアライザコンストラクタに渡す必要があります。

_serializer = MyModelSerializer(instance, context={'request': request, ...})
_
36
Boris Burkov

self._contextシリアライザ内でrequestおよびviewにアクセスします。

class MyModelSerializer(serializers.ModelSerializer):
    field1 = serializers.CharField()
    field2 = serializers.SerializerMethodField('get_current_user')

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