如何使用Django REST Framework获取当前登录用户实例
解决方案
核心逻辑:Django REST Framework中当前登录用户存储在请求对象的user属性中,你不能直接将过滤逻辑写在视图的queryset类属性中(类属性初始化时请求上下文还未生成,无法拿到用户信息),需要重写对应方法实现过滤。
- 推荐方案:使用
RetrieveAPIView适配单用户Profile场景(因为Profile和User是一对一关系,每个用户只会有一条Profile数据,不需要列表接口),接口直接返回单个Profile对象,符合一对一数据的结构特性,不需要额外处理列表的冗余结构。
# views.py from rest_framework import generics, permissions from .models import Profile from .serializers import profile_serializer class ProfileView(generics.RetrieveAPIView): serializer_class = profile_serializer # 仅允许登录用户访问 permission_classes = [permissions.IsAuthenticated] def get_object(self): # 直接返回当前登录用户关联的Profile对象 # 如果需要处理用户未创建Profile的场景,可替换为下一行逻辑自动创建 # obj, created = Profile.objects.get_or_create(user=self.request.user) return Profile.objects.get(user=self.request.user)
- 如果你需要保留
ListCreateAPIView(比如需要支持创建Profile的场景),按如下修改:
# views.py class ProfileView(generics.ListCreateAPIView): serializer_class = profile_serializer permission_classes = [permissions.IsAuthenticated] def get_queryset(self): # 重写查询集方法,只返回当前用户的Profile数据 return Profile.objects.filter(user=self.request.user) def perform_create(self, serializer): # 创建Profile时自动绑定当前登录用户,无需前端传递user参数 serializer.save(user=self.request.user)
- 现有代码语法错误修正:
- 模型定义错误修正
# models.py from django.db import models from django.conf import settings class Profile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) first_name = models.CharField(max_length=50) # 其余字段...
- 序列化器拼写错误修正
# serializer.py from rest_framework import serializers from .models import Profile class profile_serializer(serializers.ModelSerializer): class Meta: model = Profile fields = '__all__'
- 路由配置漏写引号修正
# urls.py from django.urls import path from .views import ProfileView urlpatterns = [ path('profile/', ProfileView.as_view(), name='user_profile') ]
内容的提问来源于stack exchange,提问作者C-Bizz
相关产品推荐
相关产品推荐

