You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:50:25