有没有办法在不使用
root_validator
的情况下使用多个字段别名?
我当前的代码是这样的:
class GetInfo(BaseModel):
name: str = Field(alias='name1')
name2: str = Field(alias='name2')
@root_validator
def format_name(cls, values):
if values['name'] is None:
if values['name2'] is not None:
values['name'] = values['name2']
return values
return None
name1
字段有时为空,而name2
字段大部分不为空。name2
确实为空,我想使用 name1
值。
或者你能建议比我更好的方法吗?
简短的回答,您目前只能使用一个别名。 (换句话说,您的字段可以有 2 个“名称”。)如果您想要其他别名,那么您将需要采用您的解决方法。
Pydantic V2 引入了“更强大的别名”:
class GetInfo(BaseModel):
name: str = Field(validation_alias=AliasChoices('name1', 'name_1', 'name_one'))
name2: str = Field(validation_alias=AliasChoices('name2', 'name_2', 'name_two'))
# The following will all be equal
assert all((
GetInfo(name1="Sam", name2="Colvin"),
GetInfo(name_1="Sam", name_2="Colvin"),
GetInfo(name_one="Sam", name_two="Colvin"),
))
如果有人想知道,这里有一个 pydantic v2 的可行解决方案
import pydantic
print(pydantic.__version__ ) # 2.1.0
from pydantic import BaseModel, Field, AliasChoices
class User(BaseModel):
first_name: str = Field(validation_alias=AliasChoices('first_name', 'fname'))
print(User(first_name="Sam"))
print(User(fname="toto"))