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()