pydantic 验证未添加默认值
我有一个包含多个工作表的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 个回答
暂无回答