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']
これでユーザー情報が取り出せます。
コメント