diff options
Diffstat (limited to 'lib/sqlalchemy/orm/descriptor_props.py')
-rw-r--r-- | lib/sqlalchemy/orm/descriptor_props.py | 27 |
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): |