gpt4 book ai didi

python - 如何将组装字段添加到 Pydantic 模型

转载 作者:行者123 更新时间:2023-12-03 20:24:43 24 4
gpt4 key购买 nike

说我有模特

class UserDB(BaseModel):
first_name: Optional[str] = None
last_name: Optional[str] = None
如何制作由该模型构建的另一个模型,并且其字段会根据该模型中的字段进行更改?
例如,这样的事情
class User(BaseModel):
full_name: str = first_name + ' ' + last_name
可能是这样构造的
User.parse_obj(UserDB)
谢谢!

最佳答案

如果你不想在 first_name 中保留 last_nameUser 那么你可以

  • 自定义 __init__
  • 使用验证器来设置 full_name

  • 两种方法都可以满足您的需求:
    from typing import Optional
    from pydantic import BaseModel, validator


    class UserDB(BaseModel):
    first_name: Optional[str] = None
    last_name: Optional[str] = None


    class User_1(BaseModel):
    location: str # for a change
    full_name: Optional[str] = None

    def __init__(self, user_db: UserDB, **data):
    super().__init__(full_name=f"{user_db.first_name} {user_db.last_name}", **data)


    user_db = UserDB(first_name="John", last_name="Stark")
    user = User_1(user_db, location="Mars")
    print(user)


    class User_2(BaseModel):
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    full_name: Optional[str] = None

    @validator('full_name', always=True)
    def ab(cls, v, values) -> str:
    return f"{values['first_name']} {values['last_name']}"


    user = User_2(**user_db.dict())
    print(user)
    输出
    location='Mars' full_name='John Stark'
    first_name='John' last_name='Stark' full_name='John Stark'
    更新:
    要使用 response_model,您可以通过以下方式自定义 __init__:
    class User_1(BaseModel):
    location: str # for a change
    full_name: Optional[str] = None

    # def __init__(self, user_db: UserDB, **data):
    def __init__(self, first_name, last_name, **data):
    super().__init__(full_name=f"{first_name} {last_name}", **data)


    user_db = UserDB(first_name="John", last_name="Stark")
    user = User_1(**user_db.dict(), location="Mars")
    print(user)

    关于python - 如何将组装字段添加到 Pydantic 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63492123/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com