diff --git a/odmantic/model.py b/odmantic/model.py index 8df0fc24..ae944158 100644 --- a/odmantic/model.py +++ b/odmantic/model.py @@ -84,10 +84,9 @@ def __new__( # noqa C901 namespace: Dict[str, Any], **kwargs: Any, ) -> "BaseModelMetaclass": - if (namespace.get("__module__"), namespace.get("__qualname__")) != ( - "odmantic.model", - "Model", - ): + if namespace.get("__module__") != "odmantic.model" and namespace.get( + "__qualname__" + ) not in ("Model", "EmbeddedModel"): annotations = resolve_annotations( namespace.get("__annotations__", {}), namespace.get("__module__") ) @@ -124,13 +123,15 @@ def __new__( # noqa C901 # Validate fields for (field_name, field_type) in annotations.items(): - if not is_valid_odm_field(field_name) or lenient_issubclass( - field_type, UNTOUCHED_TYPES + value = namespace.get(field_name, Undefined) + + if ( + not is_valid_odm_field(field_name) + or lenient_issubclass(field_type, UNTOUCHED_TYPES) + or isinstance(value, UNTOUCHED_TYPES) ): continue - value = namespace.get(field_name, Undefined) - if isinstance(value, PDFieldInfo): raise TypeError( "please use odmantic.Field instead of pydantic.Field" diff --git a/tests/unit/test_model_definition.py b/tests/unit/test_model_definition.py index dead36cd..829eed88 100644 --- a/tests/unit/test_model_definition.py +++ b/tests/unit/test_model_definition.py @@ -1,4 +1,4 @@ -from typing import Any, Optional +from typing import Any, Callable, Optional import pytest from pydantic import Field as PDField @@ -285,3 +285,13 @@ class M(Model): field: E = Field(primary_field=True) assert M(field=E(f=1)).doc() == {"_id": {"f": 1}} + + +def test_untouched_types_function(): + def id_str(self) -> str: + return str(self.id) + + class M(Model): + id_: Callable = id_str + + assert "id_" not in M.__odm_fields__.keys()