You need to enable JavaScript to run this app. 如何使用Django REST Framework获取当前登录用户实例
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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)
  • 现有代码语法错误修正:
  1. 模型定义错误修正
# 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)
    # 其余字段...
  1. 序列化器拼写错误修正
# serializer.py
from rest_framework import serializers
from .models import Profile

class profile_serializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'
  1. 路由配置漏写引号修正
# urls.py
from django.urls import path
from .views import ProfileView

urlpatterns = [
    path('profile/', ProfileView.as_view(), name='user_profile')
]

内容的提问来源于stack exchange,提问作者C-Bizz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 05:54:01