_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)
_
ビューセットのlist()
メソッドでシリアライザをどのように作成しますか?あなたは電話する必要があります
_serializer = self.get_serializer(data=request.data)
_
DRF mixinsでのこのメソッドのデフォルト実装 。で行われるように、シリアライザコンテキストを自動的に入力しますが、次のように手動で作成しているように感じます。
_serializer = MyModelSerializer(instance)
_
したがって、これを修正するには、get_serializer()
を呼び出すか、追加のコンテキスト引数をシリアライザコンストラクタに渡す必要があります。
_serializer = MyModelSerializer(instance, context={'request': request, ...})
_
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