sqlalchemy polymorhic_identity не работает - PullRequest
1 голос
/ 27 сентября 2010

Я пытаюсь использовать polymorphic_on в классе Python с несколькими наследованиями:

engine = create_engine(
    'mysql://xxx:yyy@localhost:3306/zzz?charset=utf8&use_unicode=0',
    pool_recycle=3600, echo=True)

Base = declarative_base()

class AbstractPersistent(object):
    version = Column('VERSION', Integer)
    last_modified_by = Column('LAST_MODIFIED_BY', String(255))
    last_modified_date = Column('LAST_MODIFIED_DATE', Date)
    created_by = Column('CREATED_BY', String(255))
    created_date = Column('CREATED_DATE', Date)

class AbstractNamed(AbstractPersistent):
    eid = Column('ENTERPRISE_ID', String(255))
    title = Column('TITLE', String(255))
    description = Column('DESCRIPTION', String(255))

class AbstractContainer(AbstractNamed):
    __tablename__ = 'CM_MEMBER_CONTAINER_T'    
    id = Column('MEMBER_CONTAINER_ID',Integer,primary_key=True)
    discriminator = Column('CLASS_DISCR', String(100))
    __mapper_args__ = {'polymorphic_on': discriminator }

class CourseSet(Base,AbstractContainer):
    __mapper_args__ = {'polymorphic_identity': 'org.sakaiproject.coursemanagement.impl.CourseSetCmImpl'}

Как видите, CourseSet содержит все столбцы своих родителей, а для столбца CLASS_DISCR установлено значение 'org.sakaiproject.coursemanagement.impl.CourseSetCmImpl'.

Но когда он делает запрос для всех CourseSet:

Session = sessionmaker(bind=engine)
session = Session()
course_sets = session.query(CourseSet).all()
print(course_sets)

Возвращает все записи 'CM_MEMBER_CONTAINER_T', но я хочу только те, для которых CLASS_DISCR установлен в 'org.sakaiproject.coursemanagement.impl.CourseSetCmImpl'

Есть идеи?

1 Ответ

0 голосов
/ 27 сентября 2010

Благодаря Майклу в гугл-группе sqlalchemy , это ответ:

AbstractContainer не отображается, это миксин, поэтому его __mapper_args__ нет используется до тех пор, пока не будет вызван подкласс Base, который запускает декларативный отображение. Ваш единственный сопоставленный класс тогда - CourseSet, который имеет свой собственный __mapper_args__, которые отменяют те из AbstractContainer - они проигнорирован.

Чтобы объединить __mapper_args__ из сопоставленного класса с классами mixin, см. пример на http://www.sqlalchemy.org/docs/orm/extensions/declarative.html?highlight=declarative#combining-table-mapper-arguments-from-multiple-mixins Используется __table_args__, но та же концепция создания полного словаря аргументов относится и к __mapper_args__.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...