fix for validators inheritance
This commit is contained in:
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
Reference in New Issue
Block a user