如何将组装的字段添加到 Pydantic 模型
How do add an assembled field to a Pydantic model
说我有模型
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_name
保留在 User
中,那么您可以
- 自定义
__init__
.
- 使用 validator 设置
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)
说我有模型
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_name
保留在 User
中,那么您可以
- 自定义
__init__
. - 使用 validator 设置
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)