如何从多个字段别名中设置一个字段?

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

有没有办法在不使用

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
值。

或者你能建议比我更好的方法吗?

python pydantic
2个回答
5
投票

Pydantic V1:

简短的回答,您目前只能使用一个别名。 (换句话说,您的字段可以有 2 个“名称”。)如果您想要其他别名,那么您将需要采用您的解决方法。

Pydantic V2:

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"),
))

3
投票

如果有人想知道,这里有一个 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"))
© www.soinside.com 2019 - 2024. All rights reserved.