pydantic 验证未添加默认值

0 投票
0 回答
43 浏览
提问于 2025-04-12 00:40

我有一个包含多个工作表的Excel表格。我正在读取整个工作表,并把它变成一个字典,字典的键是工作表的名称,值是一个包含所有数据的数据框。我使用了下面的pydantic模型,但似乎无法将数据框的值更新为默认值。如果我输入启用/禁用,它可以正常工作并且验证通过,但我想添加一个默认值,并希望这个默认值能在数据框中反映出来。我尝试了不同的方法来实现这一点,但始终无法搞定。我想让一个名为set_default_value的函数进行预检查,如果没有默认值,就设置它们,但这似乎也不奏效。

from pydantic import BaseModel, Field, validator, field_validator, model_validator
from pydantic.networks import IPv4Address
from typing_extensions import Annotated, Literal

ENABLED_DISABLED = Literal["disabled", "enabled"]


class GlobalSchema(BaseModel):
    mgmt_vip: Annotated[IPv4Address, Field(description="Global vip")]
    mgmt_gw: Annotated[IPv4Address, Field(description="Global gw")]
    radius1: Annotated[IPv4Address, Field(description="Primary Radius IP")]
    radius2: Annotated[IPv4Address, Field(description="Backup Radius IP")]
    location: Annotated[ENABLED_DISABLED, Field(description="Location", default="disabled")]


    @model_validator(mode='before')
    def set_default_values(cls, values):
        print(f'type is {type(values)}')
        # Iterate over all fields and set default value if field is empty
        for field_name, field_value in values.items():
            if field_value == "" or field_value is None:
                default_value = cls.__fields__[field_name].default
                values[field_name] = default_value
        # print(f'type is {type(values)}')
        return values


def update_schema_instance(model_instance):
    # Convert model instance to a dictionary
    values = model_instance.dict()
    return GlobalSchema(**values)

def get_dataframe_data(excel_file: str) -> dict:
    """
    Reads all sheets from an Excel file into a dictionary of DataFrames.

    Parameters:
        excel_file (str): Path to the Excel file.

    Returns:
        dict: A dictionary where keys are sheet names and values are DataFrames.
    """
    # Read all sheet names from the Excel file
    sheet_names = pd.ExcelFile(excel_file).sheet_names

    # Create an empty dictionary to store DataFrames
    sheet_name_df = {}

    # Loop through each sheet name
    for sheet_name in sheet_names:
        # Read the sheet into a DataFrame and assign it to a variable with the sheet name
        sheet_name_df[sheet_name] = pd.read_excel(excel_file, sheet_name=sheet_name, na_filter=False)

    return sheet_name_df



if __name__ == '__main__':
    sheets_data = get_dataframe_data(EXCEL_FILE)

    print(validate_schema(sheets_data))

0 个回答

暂无回答

撰写回答