diff --git a/ormar/fields/foreign_key.py b/ormar/fields/foreign_key.py index efddbe9..98e97ba 100644 --- a/ormar/fields/foreign_key.py +++ b/ormar/fields/foreign_key.py @@ -3,13 +3,12 @@ from dataclasses import dataclass from typing import Any, List, Optional, TYPE_CHECKING, Tuple, Type, Union from pydantic import BaseModel, create_model -from pydantic.typing import evaluate_forwardref +from pydantic.typing import ForwardRef, evaluate_forwardref from sqlalchemy import UniqueConstraint import ormar # noqa I101 from ormar.exceptions import RelationshipInstanceError from ormar.fields.base import BaseField -from ormar.protocols.forward_ref import ForwardRef if TYPE_CHECKING: # pragma no cover from ormar.models import Model, NewBaseModel @@ -170,13 +169,16 @@ def ForeignKey( # noqa CFQ002 owner = kwargs.pop("owner", None) self_reference = kwargs.pop("self_reference", False) - if isinstance(to, ForwardRef): + if to.__class__ == ForwardRef: __type__ = to if not nullable else Optional[to] constraints: List = [] column_type = None else: __type__, constraints, column_type = populate_fk_params_based_on_to_model( - to=to, nullable=nullable, ondelete=ondelete, onupdate=onupdate + to=to, # type: ignore + nullable=nullable, + ondelete=ondelete, + onupdate=onupdate, ) namespace = dict( @@ -250,8 +252,12 @@ class ForeignKeyField(BaseField): :return: None :rtype: None """ - if isinstance(cls.to, ForwardRef): - cls.to = evaluate_forwardref(cls.to, globalns, localns or None) + if cls.to.__class__ == ForwardRef: + cls.to = evaluate_forwardref( + cls.to, # type: ignore + globalns, + localns or None, + ) ( cls.__type__, cls.constraints, @@ -398,7 +404,7 @@ class ForeignKeyField(BaseField): :return: result of the check :rtype: bool """ - return isinstance(cls.to, ForwardRef) + return cls.to.__class__ == ForwardRef @classmethod def expand_relationship( diff --git a/ormar/fields/many_to_many.py b/ormar/fields/many_to_many.py index 75e84bd..a596b52 100644 --- a/ormar/fields/many_to_many.py +++ b/ormar/fields/many_to_many.py @@ -1,10 +1,9 @@ from typing import Any, List, Optional, TYPE_CHECKING, Tuple, Type, Union -from pydantic.typing import evaluate_forwardref +from pydantic.typing import ForwardRef, evaluate_forwardref import ormar # noqa: I100 from ormar.fields import BaseField from ormar.fields.foreign_key import ForeignKeyField -from ormar.protocols.forward_ref import ForwardRef if TYPE_CHECKING: # pragma no cover from ormar.models import Model @@ -73,7 +72,7 @@ def ManyToMany( owner = kwargs.pop("owner", None) self_reference = kwargs.pop("self_reference", False) - if isinstance(to, ForwardRef): + if to.__class__ == ForwardRef: __type__ = to if not nullable else Optional[to] column_type = None else: @@ -151,7 +150,7 @@ class ManyToManyField(ForeignKeyField, ormar.QuerySetProtocol, ormar.RelationPro :return: result of the check :rtype: bool """ - return isinstance(cls.to, ForwardRef) or isinstance(cls.through, ForwardRef) + return cls.to.__class__ == ForwardRef or cls.through.__class__ == ForwardRef @classmethod def evaluate_forward_ref(cls, globalns: Any, localns: Any) -> None: @@ -165,8 +164,12 @@ class ManyToManyField(ForeignKeyField, ormar.QuerySetProtocol, ormar.RelationPro :return: None :rtype: None """ - if isinstance(cls.to, ForwardRef) or isinstance(cls.through, ForwardRef): - cls.to = evaluate_forwardref(cls.to, globalns, localns or None) + if cls.to.__class__ == ForwardRef or cls.through.__class__ == ForwardRef: + cls.to = evaluate_forwardref( + cls.to, # type: ignore + globalns, + localns or None, + ) (cls.__type__, cls.column_type,) = populate_m2m_params_based_on_to_model( to=cls.to, nullable=cls.nullable, ) diff --git a/ormar/models/helpers/models.py b/ormar/models/helpers/models.py index feaa3cf..50ea481 100644 --- a/ormar/models/helpers/models.py +++ b/ormar/models/helpers/models.py @@ -4,7 +4,7 @@ from typing import Dict, List, Optional, TYPE_CHECKING, Tuple, Type import ormar # noqa: I100 from ormar.fields.foreign_key import ForeignKeyField from ormar.models.helpers.pydantic import populate_pydantic_default_values -from ormar.protocols.forward_ref import ForwardRef +from pydantic.typing import ForwardRef if TYPE_CHECKING: # pragma no cover from ormar import Model @@ -22,7 +22,7 @@ def is_field_an_forward_ref(field: Type["BaseField"]) -> bool: :rtype: bool """ return issubclass(field, ForeignKeyField) and ( - isinstance(field.to, ForwardRef) or isinstance(field.through, ForwardRef) + field.to.__class__ == ForwardRef or field.through.__class__ == ForwardRef ) diff --git a/ormar/protocols/forward_ref.py b/ormar/protocols/forward_ref.py deleted file mode 100644 index d03429f..0000000 --- a/ormar/protocols/forward_ref.py +++ /dev/null @@ -1,22 +0,0 @@ -import sys -from typing import Any, TYPE_CHECKING - -if sys.version_info < (3, 7): # pragma: no cover - if TYPE_CHECKING: - - class ForwardRef: - - _gorg = None - - def __init__(self, args: Any) -> None: - pass - - def _eval_type(self, globalns: Any, localns: Any) -> Any: - pass - - else: - from typing import _ForwardRef as ForwardRef -else: - from typing import ForwardRef - -ForwardRef = ForwardRef