diff --git a/HISTORY.rst b/HISTORY.rst index e1940d1..02575b2 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -6,6 +6,7 @@ History v0.19.0 (unreleased) .................... * Support ``Callable`` type hint, fix #279 by @proofit404 +* Fix schema for fields with ``validator`` decorator, fix #375 by @tiangolo v0.18.2 (2019-01-22) .................... diff --git a/pydantic/fields.py b/pydantic/fields.py index 42604f8..a944ebe 100644 --- a/pydantic/fields.py +++ b/pydantic/fields.py @@ -7,7 +7,7 @@ from .class_validators import Validator, ValidatorSignature, get_validator_signa from .error_wrappers import ErrorWrapper from .types import Json, JsonWrapper from .utils import Callable, ForwardRef, display_as_type, lenient_issubclass, list_like -from .validators import NoneType, dict_validator, find_validators, is_none_validator +from .validators import NoneType, dict_validator, find_validators Required: Any = Ellipsis @@ -358,7 +358,7 @@ class Field: """ False if this is a simple field just allowing None as used in Unions/Optional. """ - return len(self.validators) != 1 or self.validators[0][1] != is_none_validator + return self.type_ != NoneType def is_complex(self): """ diff --git a/tests/test_schema.py b/tests/test_schema.py index ff6b6c1..861e1d4 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -10,7 +10,7 @@ from uuid import UUID import pytest -from pydantic import BaseModel, Schema, ValidationError +from pydantic import BaseModel, Schema, ValidationError, validator from pydantic.schema import get_flat_models_from_model, get_flat_models_from_models, get_model_name_map, schema from pydantic.types import ( DSN, @@ -1104,3 +1104,18 @@ def test_optional_dict(): assert Model().dict() == {'something': None} assert Model(something={'foo': 'Bar'}).dict() == {'something': {'foo': 'Bar'}} + + +def test_field_with_validator(): + class Model(BaseModel): + something: Optional[int] = None + + @validator('something') + def check_field(cls, v, *, values, config, field): + return v + + assert Model.schema() == { + 'title': 'Model', + 'type': 'object', + 'properties': {'something': {'type': 'integer', 'title': 'Something'}}, + }