我有一个声明性基类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 中已经有类似的东西了吗?