Python3 SQLAlchemy является ли класс моделью
Есть некая базовая модель, от которой я наследую другие модели.
base_model.py
class BaseModel:
# def __dict__(self): # Eh, I can't redeclare the __dict__
# pass
def get_dict(self):
if not issubclass(self.__class__, DeclarativeMeta):
raise TypeError("Not a sqlaclhemy based")
_vars = vars(getattr(self, '_sa_instance_state').object)
for x in list(_vars):
if x.startswith('_') or callable(getattr(self, x)) or x == 'metadata':
_vars.pop(x)
if isinstance(getattr(self, x), BaseModel):
_vars[x] = getattr(self, x).get_dict()
return _vars
Также модель:
purchase.py
class Purchase(Base, BaseModel):
__tablename__ = 'purchases'
id = Column(Integer, primary_key=True, autoincrement=True)
...
Где Base есть:
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
Я хочу проверить в методе класса BaseModel является ли класс наследник наследником Base, ну а конкретно если исходить из кода SQLAlchemy, то:
from sqlalchemy.ext.declarative import DeclarativeMeta
Ибо из функции declarative_base() мне возвращается:
return metaclass(name, bases, class_dict)
Метакласс, который является:
def declarative_base(
... ,
metaclass=DeclarativeMeta,
):
И если делать
if not issubclass(self.__class__, DeclarativeMeta):
raise TypeError("Not a sqlaclhemy based")
То TypeError выскакивает в любом случае.
ТО-ЕСТЬ:
Я хочу запретить наследоваться от BaseModel тем классам, которые не наследуют SQLAlchemy-вский Base.
Еще больше упрощаем:
class A:
def check(self):
print(issubclass(self.__class__, B))
class B:
pass
class C(A,B):
pass
C().check() # True
А у меня почему-то при таком же раскладе, только с моделями и блэкджеком прилетает False