基于Django REST Framework获取登录用户的UserProfile详情
获取登录用户的UserProfile资料详情方案
嘿,我来帮你搞定这个需求!要实现获取登录用户的个人资料(state、city、地址等),咱们可以按照以下步骤操作:
1. 确保序列化器包含所需字段
首先,你的序列化器需要明确列出要返回的UserProfile字段,这样前端才能拿到正确的数据:
from rest_framework import serializers from .models import UserProfile class UserProfileSerializer(serializers.ModelSerializer): class Meta: model = UserProfile # 把你需要返回的字段都列在这里,比如: fields = ['state', 'city', 'add1', 'add2', 'postalcode', 'country']
2. 配置ModelViewSet只返回当前用户的资料
因为你用的是ModelViewSet,咱们可以通过重写方法来确保接口只返回登录用户自己的资料,同时加上权限控制,防止未授权访问:
from rest_framework import viewsets, Response from rest_framework.permissions import IsAuthenticated from django.shortcuts import get_object_or_404 from .models import UserProfile from .serializers import UserProfileSerializer class UserProfileViewSet(viewsets.ModelViewSet): serializer_class = UserProfileSerializer # 必须登录才能访问这个接口 permission_classes = [IsAuthenticated] # 方式一:过滤查询集,只包含当前用户的资料 def get_queryset(self): return UserProfile.objects.filter(user=self.request.user) # 方式二:重写retrieve方法,直接返回当前用户的资料(无需传pk参数) def retrieve(self, request, *args, **kwargs): # 如果用户还没创建资料,返回404;如果需要返回空数据,可以调整逻辑 instance = get_object_or_404(UserProfile, user=request.user) serializer = self.get_serializer(instance) return Response(serializer.data)
3. 配置合适的路由
如果用方式二(不需要pk的retrieve),可以在路由里直接映射到这个动作,这样前端只需要请求/profile/就能拿到当前用户的资料:
from django.urls import path from .views import UserProfileViewSet urlpatterns = [ # 直接映射retrieve动作,无需pk path('profile/', UserProfileViewSet.as_view({'get': 'retrieve'}), name='user-profile'), # 如果用DefaultRouter注册,也可以保留默认路由,但记得用户访问detail时只能用自己的pk(其实一对一的话pk是固定的) # path('', include(router.urls)), ]
额外提示
- 如果你的项目中存在用户未创建UserProfile的情况(比如新注册用户还没完善资料),可以在retrieve方法里处理
DoesNotExist异常,返回默认值或者引导用户去创建资料。 - 可以在序列化器中添加用户的基本信息(比如username),只需要在fields里加上
user__username,或者用嵌套序列化器。
内容的提问来源于stack exchange,提问作者niran
相关产品推荐
相关产品推荐

