我正在尝试验证来自请求正文的输入电子邮件,并且我已经在模型中构建了自定义字段验证器。
这是RegisterModel的代码:
from pydantic import BaseModel, EmailStr, Field, field_validator
from repository.repository_user import UserRepository
from pprint import pprint
class RegisterModel(BaseModel):
name:str
email:EmailStr
password:str = Field(..., min_length=7)
@field_validator('email')
@classmethod
def email_must_unique(cls, v):
repo = UserRepository()
result = repo.find({'email': v})
pprint(result)
return result
email_must_unique 方法将创建 UserRepository 类的新实例,并将调用 UserRepository 中的 find 方法以根据电子邮件查找特定用户。实际上 email_must_unique 方法尚未完成来验证电子邮件,它只是获取特定用户,但我已经面临错误。
这是 UserRepository 的代码:
from pymongo.database import Database
from fastapi import Depends
from config.db import db_conn
class UserRepository:
def __init__(self, db: Database = Depends(db_conn)):
self.repository = db.users # users is mongo collection
def find(self, filter: dict):
result = self.repository.find_one(filter)
return result
使用这段代码我面临这样的错误:
self.repository = db.users
^^^^^^^^
AttributeError: 'Depends' object has no attribute 'users'
我不知道是什么原因造成的。 您能给我解决此错误的解决方案或者验证电子邮件唯一性的替代方法吗?
正如 @Chiheb Nexus 的评论中提到的,不要直接调用
Depends
函数。相反,使用更优雅的 Annotated
依赖。
例如,
config/db.py
文件应如下所示:
# config/db.py
from typing import Annotated
from fastapi import Depends
from pymongo import MongoClient
from pymongo.database import Database
def get_db() -> Database:
client = MongoClient("mongodb://localhost:27017/")
return client.some_database
DbConn = Annotated[Database, Depends(get_db)] # <-- this is the annotated depend
然后你可以像这样使用它:
from config.db import DbConn
class UserRepository:
def __init__(self, db: DbConn): # <- FastAPI will call `DbConn`
self.repository = db.users
def find(self, filter: dict):
result = self.repository.find_one(filter)
return result
此外,
db
参数中的__init__
通过DbConn
进行注释,以便IDE知道其类型。