From d38073604342ef334160ca4b1ff5616ba2a7302c Mon Sep 17 00:00:00 2001 From: byrman Date: Sun, 28 Aug 2022 01:10:23 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20handling=20validators=20fo?= =?UTF-8?q?r=20non-default=20values=20(#253)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- sqlmodel/main.py | 2 +- tests/test_validation.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/test_validation.py diff --git a/sqlmodel/main.py b/sqlmodel/main.py index 8af077d..0144f6f 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 0000000..a3ff6e3 --- /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})