(1)response_model
是路径操作上的参数
先注意以下概念区分细节,什么是路径操作和路径函数:
输出的时候会以userOut的模型类型输出!
(2)路径response model exclude_unset
通过上面的例子,我们学到了如何用response model控制响应体结构,但是如果它们实际上没有存储,则可能要从结果中忽略它们。例如,如果model在NoSQL数据库中具有很多可选属性,但是不想发送很长的JSON响应,其中包含默认值。即排除没有设置的值。
其他相关参数:
使用路径操作装饰器的 response_model 参数来定义响应模型,特别是确保私有数据被过滤掉。使用response_model exclude_unset
来仅返回显式设定的值。除了 responsee_model exclude_unset
以外,还有 response model exclude defaults
和 response model exclude none
我们可以很直观的了解到他们的意思,不返回是默认值的字段和不返回是None
的字段。
`responsee_modele_include:只显示某些字段:
`responsee_modele_exclude:删除某个字段
官方文档:响应模型
响应模型在参数中被声明,而不是作为函数返回类型的注解,这是因为路径函数可能不会真正返回该响应模型,而是返回一个
dict、数据库对象或其他模型,然后再使用 response_model 来执行字段约束和序列化
python查漏补缺
class UserInDB(BaseModel):username: strhashed_password: stremail: EmailStrfull_name: Union[str, None] = Nonedef fake_password_hasher(raw_password: str):return "supersecret" + raw_passworddef fake_save_user(user_in: UserIn):hashed_password = fake_password_hasher(user_in.password)user_in_db = UserInDB(**user_in.dict(), hashed_password=hashed_password)print("User saved! ..not really")return user_in_db
1.user_in.dict()
是 Python 的字典解包操作符。它会将字典中的键值对解包为关键字参数传递给函数或类构造器。
也就是说,**user_in.dict() 会将 user_in.dict() 返回的字典内容(例如,‘username’: ‘johndoe’)传递给 UserInDB 构造器,作为关键字参数。
例如,假设 user_in.dict() 返回了以下字典:
{'username': 'johndoe','password': 'plaintextpassword','email': 'johndoe@example.com','full_name': 'John Doe'
}
那么执行 **user_in.dict()
后,相当于将以下关键字参数传递给 UserInDB 构造器:
username='johndoe', password='plaintextpassword', email='johndoe@example.com', full_name='John Doe'
2.hashed_password=hashed_password
这部分将 hashed_password 作为额外的关键字参数传递给 UserInDB 构造器。这个参数是在 user_in.dict() 中没有的,因此需要单独传入。
在原始的 user_in 数据模型中,可能没有 hashed_password 字段,而是 password 字段。为了加密后保存密码,你计算了 hashed_password,并显式将其传入 UserInDB 构造函数。