私はdjango rest frameworkでユーザプロファイルを実装しようとしています。django rest frameworkの認証方法に応じて、別のシリアライザを使用してください。
ユーザーは他のユーザーのプロフィールをリクエストできる必要があります。しかし、プロファイルには機密情報が含まれているため、プロファイルを要求したときに非所有者と非認証ユーザーに返される情報を制限したいと考えています。
私は、そのリクエストにどのシリアライザを使用するかを決定するビューメソッド内で実行できるテストを探しています。
どうすればいいですか?
# models.py
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='profile')
bio = models.CharField(max_length=100)
# dob is sensitive and should be protected...
dob = models.DateTimeField(blank=True, null=True)
私のシリアライザは、次のようになります。
# serializers.py
# Only for the owner...
class ProfileOwnerSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.ReadOnlyField(source='user.id')
first_name = serializers.ReadOnlyField(source='user.first_name')
last_name = serializers.ReadOnlyField(source='user.last_name')
class Meta:
model = Profile
fields = (
'url',
'id',
'dob', #sensitive
'user',
'first_name',
'last_name', #sensitive
)
#For logged in users...
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.ReadOnlyField(source='user.id')
first_name = serializers.ReadOnlyField(source='user.first_name')
class Meta:
model = Profile
fields = (
'url',
'id',
'bio',
'user',
'first_name',
)
#For everyone else...
class NonAuthProfileSerializer:
...
そして、私はここでそれらを区別しようとする...
# views.py
class ProfileDetail(APIView):
"""
Retrieve a profile instance.
"""
# Can't user permission_classes bc I want to cater to different classes...
def get_object(self, pk):
try:
return Profile.objects.get(pk=pk)
except Profile.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
profile = self.get_object(pk)
# is_owner = ???
# is_authenticated = ???
# Define the serializer to be ProfileSerializer, ProfileOwnerSerializer, etc.
serializer = CorrectSerializer(
profile,
context={"request": request},
)
return Response(serializer.data)
私はそれがあまりにもするだろうとは思いませんプロファイルIDを相互参照できるだけなので、リクエストがオーナーによって送信されたかどうかを確認するのは難しいです。
ただし、ユーザーがログインしているかどうかを確認するにはどうすればよいですか。私はビューメソッドでrequest.user.auth
を見てみましたが、リクエストがログインしているかどうかにかかわらず、None
と思われます。