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()
を印刷しましたが、まだそれは空リストです。Djangoの残りのフレームワーク - self.contextが要求属性
このスレッドに従いました。
Get current user in Model Serializer
PS:私はdjangorestframework==3.3.3
、Django==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)
通常、self.contextはgenerics.py:GenericApiVie 'によって満たされています'viewset.list()/ detail()/ create()/ delete()の先頭で呼び出される' generics.py:GenericApiView.get_serializer() 'によって呼び出されるw.get_serializer_context )/ update() 'を実行します。 ViewSetコードを提供することができますか?あなたが何をしようとしているのかを理解する必要があるためですか? –
@Bob:問題のビューセットコードを追加しました。plzが見ています。 – Wendy
遅れて申し訳ありません。ウェンディ、「#何か」はあまり説明しない。ビューセットの 'list()'メソッドでシリアライザをどのように作成しますか?シリアライザのコンテキストを自動的に取得するには、 'serializer = self.get_serializer(data = request.data)'を呼び出すべきですが、 'serializer = MyModelSerializer(instance)'のように手動で作成していると思います。 'serializer = MyModelSerializer(instance、context = {'request':request、...})'のように、 'get_serializer()'を呼び出すか、シリアライズのコンストラクタに余分なコンテキスト引数を渡す必要があります。 –