我想根据用户 ID 在响应中添加一个额外字段。
该项目是一个迷你电子商务应用程序,只有店主可以编辑其内容。当前端请求 GetAllShops 时,
如何通过比较商店 id 与客户端 id 来为从 sql alchemy ORM 返回的每个商店实体附加一个布尔字段,如 is_owner ?
我正在使用 Pydantic 和 FastAPI。
您可以使用根验证器来完成此操作,这是最强大的方法:
from pydantic import BaseModel, root_validator
class MyModel(BaseModel):
client_id: str
shop_id: str
is_owner: bool = False
# Root validators are executed during model instantiation
# before values are assigned
@root_validator(pre=True)
def check_if_owner(cls, values: dict):
if values['client_id'] == values['shop_id']:
values['is_owner'] = True
# All done
return values
另一个更细致的解决方案是使用常规验证器来访问所有类值。这与上面类似,但仅针对此字段。 (注意:此方法可能会变得非常复杂且繁琐,因此请谨慎操作。)
from pydantic import BaseModel, validator
class MyModel(BaseModel):
client_id: str
shop_id: str
is_owner: bool = False
@validator('is_owner', always=True)
def check_if_owner(cls, value, values: dict):
if values['client_id'] == values['shop_id']:
return True
else:
return False
自 Pydantic v2.0
computed_field
装饰器可用:
from pydantic import BaseModel, computed_field
class ShopEntity(BaseModel):
client_id: str
shop_id: str
@computed_field
@property
def is_owner(self) -> bool:
return self.client_id == self.shop_id