Как определить два родительских класса для сущностей SqlAlchemy? - PullRequest
0 голосов
/ 14 июня 2019

До сих пор у меня есть родительский класс Entity для всех моих классов orm:

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 и mixin 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 голосов
/ 14 июня 2019

Флаг __abstract__ сделал свое дело:

class EntityRelation(Base):   
    __abstract__ = True

class Entity(Base, AbstractEntity): 
    __abstract__ = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...