さまざまな方法で子供のモデルを作成する必要があります。私はメタクラスを行うことにしました:
class AProxy(object):
#some methods
class BProxy(object):
#some methods
class TestMeta(_BoundDeclarativeMeta):
def __new__(cls, name, bases, dct):
base = type.__new__(cls, name, bases, dct)
if not dct.get('__tablename__'): # child create
return base
prefix = name
tablename_prefix = base.__tablename__
children = ['A', AProxy,
'B', BProxy]
module = sys.modules.get(base.__module__)
for child in children:
n = prefix + child[0]
b = (child[1], base)
d = dict(__mapper_args__= dict(polymorphic_identity= tablename_prefix + child[0].lower()))
setattr(module, n, TestMeta(n, b, d))
return base
class Test(db.Model):
__tablename__ = 'test'
__metaclass__ = TestMeta
@declared_attr
def __mapper_args__(cls):
return {'polymorphic_identity': '%s' % cls.__tablename__,
'polymorphic_on': cls._type,
'with_polymorphic': '*'}
id = db.Column(db.Integer, primary_key= True)
_type = db.Column(db.String(30), index= False)
# some columns
インデックス列 '_type' の重複エラー。インデックス データベースを削除すると正常に作成されますが、子 (TestA、TestB) フィールドを作成すると '_type' None がクリアされます。エラーをフェッチするときに「_type」を手動で設定した場合: AssertionError: No such polymorphic_identity u'testa' is defined