Django REST frameworkのSerializerでユーザー情報を取得する

Django REST framework(以下、DRF)のSerializeでユーザー情報を取得する方法をご紹介します。

この記事でのご紹介する取得する方は

  • contextから取得
  • CurrentUserDefaultから取得

です。

どちらも簡単にユーザー情報を取り出せるので用途に合わせて使ってください。

目次

contextから取得する

DRFのcontextのrequestの中に現在のユーザー情報が入ってるので、そこからユーザー情報を取り出します。

以下のコードのようにするとユーザー情報を取り出せます。

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post

    def save(self):
        user = self.context['request'].user
        ...

ログインしていないユーザーもアクセスできる場合は、以下のようにするとリクエスト元のユーザーに合わせて安全にユーザー情報を取り出せませす。

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post

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

CurrentUserDefault()から取得する

DRFではCurrentUserDefault()が用意されています。

CurrentUserDefault()を読み出すだけで現在のユーザー情報を取得することができます。

DRFのドキュメントにあるようにCurrentUserDefault()を使うにはcontextにrequestを入れる必要があります。

A default class that can be used to represent the current user. In order to use this, the ‘request’ must have been provided as part of the context dictionary when instantiating the serializer.

現在のユーザーを表すために使用できるデフォルトのクラスです。このクラスを使用するには、シリアライザーをインスタンス化する際に、コンテキスト・ディクショナリーの一部として「request」が提供されている必要があります。

https://www.django-rest-framework.org/api-guide/validators/#currentuserdefault

まずはcontextにrequestを入れてSerializerを呼び出します。

context = {
    "request": self.request,
}

serializer = PostSerializer(data=request.data, context=context)

次にSerializerではCurrentUserDefault()を使ってユーザー情報を取得します。

from rest_framework.fields import CurrentUserDefault

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post

   def save(self):
        user = serializers.HiddenField(default=serializers.CurrentUserDefault())
        title = self.validated_data['title']
        article = self.validated_data['article']

これでユーザー情報が取り出せます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする


The reCAPTCHA verification period has expired. Please reload the page.

目次