У меня есть декларативный базовый класс Entity
, который определяет столбец name
как полиморфный, например,
class Entity(DeclarativeBase):
name = Column('name', String(40))
__mapper_args__ = {'polymorphic_on':name}
В подклассах я теперь могу сказать
class Experiment(Entity):
__mapper_args__ = {'polymorphic_identity': "experiment"}
и будет сделано. Тем не менее, я хотел бы упростить создание подклассов для пользователей моей библиотеки и поэтому сделать возможным следующее:
- Имейте лучший синтаксис для него, который не так сложен, как синтаксис по умолчанию. Это может быть простое присваивание
poly_id = "exp"
внутри класса или, возможно, декоратор класса.
- Если не указано polymorphic_identity, извлеките имя из имени подкласса.
Я попытался сделать это с помощью метаклассов (только вторая часть):
from sqlalchemy.ext.declarative import DeclarativeMeta
class Meta(type):
def __init__(cls, classname, bases, dict_):
dict_["__mapper_args__"] = {'polymorphic_identity': classname}
return super(Meta, cls).__init__(classname, bases, dict_)
class CombinedMeta(Meta, DeclarativeMeta):
pass
class Experiment(Entity):
__metaclass__ = CombinedMeta
так что, на мой взгляд, мой Meta
должен установить имя перед вызовом DeclarativeMeta
, но, похоже, он не работает. Так что либо DeclarativeMeta
, который предположительно устанавливает полиморфное имя, никогда не увидит изменения, потому что я испортил MRO, или то, что я делаю, в любом случае совершенно неправильно. Что мне нужно изменить или в SQLAlchemy уже есть что-то подобное?