如何修改响应模型中的额外字段以根据 ORM 对象区分项目是否属于用户

问题描述 投票:0回答:2

我想根据用户 ID 在响应中添加一个额外字段。

该项目是一个迷你电子商务应用程序,只有店主可以编辑其内容。当前端请求 GetAllShops 时,

如何通过比较商店 id 与客户端 id 来为从 sql alchemy ORM 返回的每个商店实体附加一个布尔字段,如 is_owner

我正在使用 Pydantic 和 FastAPI。

postgresql sqlalchemy fastapi pydantic
2个回答
0
投票

您可以使用根验证器来完成此操作,这是最强大的方法:

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

0
投票

自 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
© www.soinside.com 2019 - 2024. All rights reserved.