如何在Django REST Framework中查询UserProfile的邮箱/手机号是否存在?
解决方案
1. 新增参数校验序列化器
先创建一个专门用于接收查询参数的序列化器,负责校验请求中是否提供了邮箱或手机号:
class EmailPhoneCheckSerializer(serializers.Serializer): email = serializers.EmailField(required=False) phone = serializers.CharField(required=False) def validate(self, data): if not data.get('email') and not data.get('phone'): raise serializers.ValidationError("必须提供邮箱或手机号中的一个") return data
2. 创建独立的存在性查询视图
放弃ModelViewSet(它自带的对象级权限控制会导致你遇到的访问限制问题),改用APIView实现灵活的逻辑:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from .models import UserProfile from .serializers import EmailPhoneCheckSerializer class CheckUserExistsView(APIView): # 仅验证请求携带有效的Firebase JWT令牌,不限制查询范围 permission_classes = [IsAuthenticated] def get(self, request): # 校验查询参数合法性 serializer = EmailPhoneCheckSerializer(data=request.query_params) serializer.is_valid(raise_exception=True) email = serializer.validated_data.get('email') phone = serializer.validated_data.get('phone') # 构建查询条件 query_set = UserProfile.objects.all() if email: query_set = query_set.filter(email=email) if phone: query_set = query_set.filter(phone=phone) # 返回存在性结果 return Response({"exists": query_set.exists()})
3. 配置路由
在项目的urls.py中添加该视图的路由:
from django.urls import path from .views import CheckUserExistsView urlpatterns = [ # 其他已有路由... path('check-user-exists/', CheckUserExistsView.as_view(), name='check-user-exists'), ]
关键说明
- 权限控制:使用
IsAuthenticated确保只有携带有效Firebase JWT的请求才能访问,同时避免了ModelViewSet自带的对象级权限校验(不会因为查询非自身的邮箱/手机号而返回403)。 - 安全性:仅返回存在性布尔值,不会泄露任何用户敏感数据,符合需求中的安全要求。
- 请求示例:
- 查询邮箱:
GET /check-user-exists/?email=test@example.com - 查询手机号:
GET /check-user-exists/?phone=13800138000 - 响应格式:
{"exists": true}或{"exists": false}
- 查询邮箱:
内容的提问来源于stack exchange,提问作者Kyle Andrew
相关产品推荐
相关产品推荐

