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

FastAPI如何将Schema字段传入MongoDB查询?注册校验手机号

问题描述

我正计划在首个API项目中使用MongoDB,想了解如何将Schema中的字段传入MongoDB查询。注册时需校验用户手机号是否已存在,相关代码如下:

原查询路由代码

@router.get('/details')
async def register_user():
     user = selldei_user.ads_collection.find_one({"mobile_number":"01*****"})
     user =  json.loads(json_util.dumps(user))
     user = user["mobile_number"]
     return user

原注册路由代码

@router.post('/register')
async def register_user(user: schemas.User):
     user_exist = selldei_user.ads_collection.find_one({"mobile_number":"01*****"}) #here I want to pass my schemas fields 
     user_exist =  json.loads(json_util.dumps(user))
     user_exist = user["mobile_number"]
     if not  user_exist:    
        user = selldei_user.ads_collection.insert_one(user.dict()).inserted_id
    
    return {"status":"success"}

原Schema定义

class User(BaseModel):
      first_name: str
      last_name: str
      email: str
      mobile_number: str
      password: str

解决方案

核心是直接从传入的User实例中提取mobile_number字段用于MongoDB查询,同时修正原代码中的逻辑错误:

修正后的注册路由代码

@router.post('/register')
async def register_user(user: schemas.User):
    # 从Schema实例中获取手机号,传入MongoDB查询
    user_exist = selldei_user.ads_collection.find_one({"mobile_number": user.mobile_number})
    
    if not user_exist:    
        # 将Schema实例转为字典插入数据库
        inserted_id = selldei_user.ads_collection.insert_one(user.dict()).inserted_id
        return {"status": "success", "user_id": str(inserted_id)}
    else:
        return {"status": "error", "message": "该手机号已注册"}

关键说明

  • 直接通过user.mobile_number获取Schema中的手机号字段,替换原代码的硬编码值,实现动态校验请求传入的手机号。
  • 原代码中user_exist = json.loads(json_util.dumps(user))是逻辑错误,这一步把传入的User实例转成字典,完全偏离了“查询手机号是否存在”的目的,直接用find_one的返回值判断即可:返回值不为空则手机号已存在。
  • 补充了手机号已存在时的错误返回,让接口逻辑更完整;插入成功后返回用户ID(MongoDB的_id需转为字符串才能正常序列化返回)。

优化后的查询路由(可选)

如果需要根据手机号动态查询用户详情,可以调整为:

@router.get('/details')
async def get_user_details(mobile_number: str):
    user = selldei_user.ads_collection.find_one({"mobile_number": mobile_number})
    if user:
        # 将MongoDB的BSON数据转为JSON可序列化格式
        user_json = json.loads(json_util.dumps(user))
        return user_json
    else:
        return {"status": "error", "message": "用户不存在"}

内容的提问来源于stack exchange,提问作者boyenec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:40:32