1

さまざまな方法で子供のモデルを作成する必要があります。私はメタクラスを行うことにしました:

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

4

0 に答える 0