簡體   English   中英

Pydantic:如何使用一個字段的值來設置其他字段的值?

[英]Pydantic: How to use one field's value to set values for other fields?

我有的

字典:

user_dict = {'user': {'field1': 'value1',
                      'field2': 'value2'},
             'admin':{'field1': 'value3',
                      'field2': 'value4'}}

皮丹提克 Model:

class User(BaseModel):
    account_type: Optional[str] = 'user'
    field1: Optional[str] = ''
    field1: Optional[str] = ''

    class Config:
        validate_assignment = True

    @validator("account_type", pre=True, always=True)
        def _set_account_type(cls, account_type: str):
        return account_type or "user"

期望的結果

我想根據 account_type 從 user_dict 中查找 field1 和 field2 的值。 所以我應該能夠做這樣的事情:

user = User()
print(user.field1)
# > 'value1'

print(user.field2)
# > 'value2'

user2 = User(field1=None, field2=None)
print(user2.field1)
# > 'value1'

print(user2.field2)
# > 'value2'

user3 = User(account_type="admin")
print(user3.field1)
# > 'value3'

print(user3.field2)
# > 'value4'

我試過的

class User(BaseModel):
    account_type: Optional[str] = 'user'
    field1: Optional[str] = user_dict['account_type']['field1']
    field1: Optional[str] = user_dict['account_type']['field2']

    class Config:
        validate_assignment = True

    @validator("account_type", pre=True, always=True)
        def _set_account_type(cls, account_type: str):
        return account_type or "user"

user = User()
print(user.field1)
# > 'value1'

user = User(field1=None)
print(user.field1)
# > None

對 field1 和 field2 使用驗證器:

class User(BaseModel):
    account_type: Optional[str] = 'user'
    field1: Optional[str]
    field1: Optional[str]

    class Config:
        validate_assignment = True

    @validator("account_type", pre=True, always=True)
        def _set_account_type(cls, account_type: str):
        return account_type or "user"
    
    @validator("field1", pre=True, always=True)
        def _set_plan_credits(cls, value):
            if value is None:
                value = 'value1'
        return user_dict['account_type']['field1'] or value

    @validator("field2", pre=True, always=True)
        def _set_rollover_credits(cls, value):
            if value is None:
                value = 'value2'
        return user_dict['account_type']['field2'] or value

user = User()
# > AttributeError: type object 'Account' has no attribute 'account_type'

關於我可以做些什么來獲得預期結果的任何想法?

我通過使用root_validator裝飾器解決了它,如下所示:

解決方案:

@root_validator(pre=False)
def _set_fields(cls, values: dict) -> dict:
    """This is a validator that sets the field values based on the
    the user's account type.

    Args:
        values (dict): Stores the attributes of the User object.

    Returns:
        dict: The attributes of the user object with the user's fields.
    """
    values["field1"] = user_dict[values["account_type"]]["field1"]
    values["field2"] = user_dict[values["account_type"]]["field2"]
    return values

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM