如何为SqlAlchemy实体定义两个父类?

时间:2019-06-14 11:23:28

标签: python inheritance orm sqlalchemy

直到现在,我的所有orm类都有一个父类Entity

class AbstractEntity():  

    id = Column(Integer, primary_key=True) 

    @declared_attr
    def __tablename__(self):
        return AbstractEntity.table_name_for_class(self) 

    ...


Entity = declarative_base(cls=AbstractEntity)

class Drink(Entity):
    name = Entity.stringColumn()

我希望我的类仅继承自单个类Entity,而不继承自类Base和混合类Entity。很好。

但是,现在我想引入另一个父类EntityAssociation,我可以将其用作我的所有关联类的父类,这些关联类用于多对多关系,例如

class DrinkIngretients(EntityAssociation):
    drink_id = Entity.foreign_key(Drink)
    ingredient_id = Entity.foreign_key(Ingredient)
    ...

EntityAssociation应该继承自Base = declarative_base(),而不应该继承自AbstractEntity。 (它不应包含在id中定义的AbstractEntity列。)

=>如何实现该继承结构?

我尝试过

class AbstractEntity():  

    id = Column(Integer, primary_key=True) 

    @declared_attr
    def __tablename__(self):
        return AbstractEntity.table_name_for_class(self) 

    ...

Base = declarative_base()

class Entity(Base, AbstractEntity):
    pass

class EntityAssociation(Base):
    pass

但是

的行为
Entity = declarative_base(cls=AbstractEntity)

class Entity(Base, AbstractEntity):
    pass

似乎有所不同。

  

类没有指定表名,并且不继承自现有的表映射类。

=>如何指定Entity和EntityAssociation类不应具有额外的表名?

=>关于如何获得想要的继承结构的其他建议?

1 个答案:

答案 0 :(得分:0)

__abstract__标志可以达到目的:

class EntityRelation(Base):   
    __abstract__ = True

class Entity(Base, AbstractEntity): 
    __abstract__ = True