fix for validators inheritance

This commit is contained in:
collerek
2021-10-15 10:39:41 +02:00
parent 7f0eee2936
commit 851fe0c14f
2 changed files with 73 additions and 4 deletions

View File

@ -303,11 +303,10 @@ def populate_choices_validators(model: Type["Model"]) -> None: # noqa CCR001
""" """
fields_with_choices = [] fields_with_choices = []
if not meta_field_not_set(model=model, field_name="model_fields"): if not meta_field_not_set(model=model, field_name="model_fields"):
if hasattr(model, "_choices_fields"): if not hasattr(model, "_choices_fields"):
return
model._choices_fields = set() model._choices_fields = set()
for name, field in model.Meta.model_fields.items(): for name, field in model.Meta.model_fields.items():
if check_if_field_has_choices(field): if check_if_field_has_choices(field) and name not in model._choices_fields:
fields_with_choices.append(name) fields_with_choices.append(name)
validator = make_generic_validator(generate_validator(field)) validator = make_generic_validator(generate_validator(field))
model.__fields__[name].validators.append(validator) model.__fields__[name].validators.append(validator)

View File

@ -0,0 +1,70 @@
import enum
import databases
import pydantic
import pytest
import sqlalchemy
from pydantic import ValidationError
import ormar
from tests.settings import DATABASE_URL
metadata = sqlalchemy.MetaData()
database = databases.Database(DATABASE_URL)
class BaseMeta(ormar.ModelMeta):
database = database
metadata = metadata
class BaseModel(ormar.Model):
class Meta:
abstract = True
id: int = ormar.Integer(primary_key=True)
class EnumExample(str, enum.Enum):
A = "A"
B = "B"
C = "C"
class ModelExample(BaseModel):
class Meta(BaseMeta):
tablename = "examples"
str_field: str = ormar.String(min_length=5, max_length=10, nullable=False)
enum_field: str = ormar.String(
max_length=1, nullable=False, choices=list(EnumExample)
)
@pydantic.validator("str_field")
def validate_str_field(cls, v):
if " " not in v:
raise ValueError("must contain a space")
return v
ModelExampleCreate = ModelExample.get_pydantic(exclude={"id"})
def test_ormar_validator():
ModelExample(str_field="a aaaaaa", enum_field="A")
with pytest.raises(ValidationError) as e:
ModelExample(str_field="aaaaaaa", enum_field="A")
assert "must contain a space" in str(e)
with pytest.raises(ValidationError) as e:
ModelExample(str_field="a aaaaaaa", enum_field="Z")
assert "not in allowed choices" in str(e)
def test_pydantic_validator():
ModelExampleCreate(str_field="a aaaaaa", enum_field="A")
with pytest.raises(ValidationError) as e:
ModelExampleCreate(str_field="aaaaaaa", enum_field="A")
assert "must contain a space" in str(e)
with pytest.raises(ValidationError) as e:
ModelExampleCreate(str_field="a aaaaaaa", enum_field="Z")
assert "not in allowed choices" in str(e)