列をポリモーフィックとして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 が指定されていない場合は、サブクラスの名前から名前を抽出します。
メタクラスを使用してこれを実行しようとしました (2 番目の部分のみ)。
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 にはすでにこのようなものがありますか?