Class Initialisation Validation Kwarg by AndrewRiggs-Atkins · Pull Request #227 · fastapi/sqlmodel
As discussed in issue #134, this pr enables pydantic validation to be run on object instantiation when the class is set as a table, instead of only when being commited into the database.
main.py > SQLModelMetaclass > new > line ~307
config_validate = get_config("validate") if config_validate is True: # If it was passed by kwargs, ensure it's also set in config new_cls.__config__.validate = config_validate for k, v in new_cls.__fields__.items(): col = get_column_from_field(v) setattr(new_cls, k, col)
main.py > SQLModel > init > line ~517
if ( (not getattr(__pydantic_self__.__config__, "table", False) or getattr(__pydantic_self__.__config__, "validate", False)) # Added validate and validation_error ): raise validation_error
usage
class Hero(SQLModel, table=True, validate=True): # Added validate id: int = Field(primary_key=True, nullable=False) number: int @validator('number') def less_than_100(cls, v): if v > 100: raise ValueError('must be less than 100') return v
When validate is disabled, validation runs on commit as usual, with it enabled, validation runs on object initialisation. Works for pydanic @validate functions as well as others such as max_length