add overwriting pydantic types #311

This commit is contained in:
collerek
2021-08-27 16:02:20 +02:00
parent 40fe1ad864
commit 9bb22d2ea4
6 changed files with 102 additions and 3 deletions

View File

@ -31,6 +31,7 @@ class BaseField(FieldInfo):
def __init__(self, **kwargs: Any) -> None:
self.__type__: type = kwargs.pop("__type__", None)
self.__pydantic_type__: type = kwargs.pop("__pydantic_type__", None)
self.__sample__: type = kwargs.pop("__sample__", None)
self.related_name = kwargs.pop("related_name", None)

View File

@ -143,12 +143,14 @@ def validate_not_allowed_fields(kwargs: Dict) -> None:
encrypt_secret = kwargs.pop("encrypt_secret", None)
encrypt_backend = kwargs.pop("encrypt_backend", None)
encrypt_custom_backend = kwargs.pop("encrypt_custom_backend", None)
overwrite_pydantic_type = kwargs.pop("overwrite_pydantic_type", None)
not_supported = [
default,
encrypt_secret,
encrypt_backend,
encrypt_custom_backend,
overwrite_pydantic_type,
]
if any(x is not None for x in not_supported):
raise ModelDefinitionError(

View File

@ -84,8 +84,13 @@ class ModelFieldFactory:
encrypt_backend = kwargs.pop("encrypt_backend", EncryptBackends.NONE)
encrypt_custom_backend = kwargs.pop("encrypt_custom_backend", None)
overwrite_pydantic_type = kwargs.pop("overwrite_pydantic_type", None)
namespace = dict(
__type__=cls._type,
__pydantic_type__=overwrite_pydantic_type
if overwrite_pydantic_type is not None
else cls._type,
__sample__=cls._sample,
alias=kwargs.pop("name", None),
name=None,

View File

@ -5,8 +5,8 @@ import pydantic
from pydantic.fields import ModelField
from pydantic.utils import lenient_issubclass
from ormar.fields import BaseField # noqa: I100, I202
from ormar.exceptions import ModelDefinitionError
from ormar.exceptions import ModelDefinitionError # noqa: I100, I202
from ormar.fields import BaseField
if TYPE_CHECKING: # pragma no cover
from ormar import Model
@ -84,9 +84,15 @@ def populate_pydantic_default_values(attrs: Dict) -> Tuple[Dict, Dict]:
for field_name, field in potential_fields.items():
field.name = field_name
model_fields[field_name] = field
attrs["__annotations__"][field_name] = (
default_type = (
field.__type__ if not field.nullable else Optional[field.__type__]
)
overwrite_type = (
field.__pydantic_type__
if field.__type__ != field.__pydantic_type__
else None
)
attrs["__annotations__"][field_name] = overwrite_type or default_type
return attrs, model_fields