summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/descriptor_props.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/orm/descriptor_props.py')
-rw-r--r--lib/sqlalchemy/orm/descriptor_props.py27
1 files changed, 17 insertions, 10 deletions
diff --git a/lib/sqlalchemy/orm/descriptor_props.py b/lib/sqlalchemy/orm/descriptor_props.py
index 84d15360d..55c7e9290 100644
--- a/lib/sqlalchemy/orm/descriptor_props.py
+++ b/lib/sqlalchemy/orm/descriptor_props.py
@@ -52,6 +52,8 @@ from .. import util
from ..sql import expression
from ..sql import operators
from ..sql.elements import BindParameter
+from ..util.typing import de_stringify_annotation
+from ..util.typing import is_fwd_ref
from ..util.typing import is_pep593
from ..util.typing import typing_get_args
@@ -351,18 +353,23 @@ class CompositeProperty(
argument = typing_get_args(argument)[0]
if argument and self.composite_class is None:
- if isinstance(argument, str) or hasattr(
- argument, "__forward_arg__"
+ if isinstance(argument, str) or is_fwd_ref(
+ argument, check_generic=True
):
- str_arg = (
- argument.__forward_arg__
- if hasattr(argument, "__forward_arg__")
- else str(argument)
- )
- raise sa_exc.ArgumentError(
- f"Can't use forward ref {argument} for composite "
- f"class argument; set up the type as Mapped[{str_arg}]"
+ if originating_module is None:
+ str_arg = (
+ argument.__forward_arg__
+ if hasattr(argument, "__forward_arg__")
+ else str(argument)
+ )
+ raise sa_exc.ArgumentError(
+ f"Can't use forward ref {argument} for composite "
+ f"class argument; set up the type as Mapped[{str_arg}]"
+ )
+ argument = de_stringify_annotation(
+ cls, argument, originating_module, include_generic=True
)
+
self.composite_class = argument
if is_dataclass(self.composite_class):