From: byrman Date: Sat, 27 Aug 2022 23:10:23 +0000 (+0200) Subject: 🐛 Fix handling validators for non-default values (#253) X-Git-Tag: 0.0.7~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d38073604342ef334160ca4b1ff5616ba2a7302c;p=thirdparty%2Ffastapi%2Fsqlmodel.git 🐛 Fix handling validators for non-default values (#253) Co-authored-by: Sebastián Ramírez --- diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 8af077da..0144f6f4 100644 --- a/sqlmodel/main.py +++ b/sqlmodel/main.py @@ -582,7 +582,7 @@ class SQLModel(BaseModel, metaclass=SQLModelMetaclass, registry=default_registry values, fields_set, validation_error = validate_model(cls, value) if validation_error: raise validation_error - model = cls(**values) + model = cls(**value) # Reset fields set, this would have been done in Pydantic in __init__ object.__setattr__(model, "__fields_set__", fields_set) return model diff --git a/tests/test_validation.py b/tests/test_validation.py new file mode 100644 index 00000000..a3ff6e39 --- /dev/null +++ b/tests/test_validation.py @@ -0,0 +1,33 @@ +from typing import Optional + +import pytest +from pydantic import validator +from pydantic.error_wrappers import ValidationError +from sqlmodel import SQLModel + + +def test_validation(clear_sqlmodel): + """Test validation of implicit and explict None values. + + # For consistency with pydantic, validators are not to be called on + # arguments that are not explicitly provided. + + https://github.com/tiangolo/sqlmodel/issues/230 + https://github.com/samuelcolvin/pydantic/issues/1223 + + """ + + class Hero(SQLModel): + name: Optional[str] = None + secret_name: Optional[str] = None + age: Optional[int] = None + + @validator("name", "secret_name", "age") + def reject_none(cls, v): + assert v is not None + return v + + Hero.validate({"age": 25}) + + with pytest.raises(ValidationError): + Hero.validate({"name": None, "age": 25})