Hello.

Is there any way I can use some expression for polymorphic_on mapper
attribute?

I have tried some ways, but not got what I want.

# --- my tries
import sqlalchemy as sa
from sqlalchemy import *
from sqlalchemy import orm
from sqlalchemy.ext.declarative import declarative_base

_decl = declarative_base()

class generic(_decl):
    __tablename__ = 'generic'

    idnr = Column(Integer, primary_key=True)
    type = Column(String(32), nullable=False)
    data = Column(String(128))
    discriminator = orm.column_property(case(value=type, whens={'abc':type,
'cde':type}, else_='generic').label('discriminator'))

    __mapper_args__ = {'polymorphic_on': type,
'polymorphic_identity':'generic'}
    #__mapper_args__ = {'polymorphic_on': discriminator,
'polymorphic_identity':'generic'}
    #__mapper_args__ = {'polymorphic_on': case(value=type,
whens={'abc':type, 'cde':type}, else_='generic'),
'polymorphic_identity':'generic'}

class type_abc(generic):
    __tablename__ = 'abc'

    generic_idnr = Column(Integer, ForeignKey(generic.idnr,
onupdate='CASCADE', ondelete='CASCADE'), primary_key=True)
    abc = Column(Integer, nullable=False)
    __mapper_args__ = {'polymorphic_identity':'abc'}

class type_cde(generic):
    __tablename__ = 'cde'

    generic_idnr = Column(Integer, ForeignKey(generic.idnr,
onupdate='CASCADE', ondelete='CASCADE'), primary_key=True)
    cde = Column(Integer, nullable=False)
    __mapper_args__ = {'polymorphic_identity':'cde'}

def main():
    engine = create_engine('sqlite:///:memory:', echo=True)
    generic.metadata.create_all(engine)
    sm = orm.sessionmaker(bind=engine)
    ses = sm()

    a = type_cde()
    a.cde = 1
    ses.add(a)

    a = type_abc()
    a.abc = 2
    ses.add(a)

    #pdb.set_trace()
    a = generic()
    a.type = 'zzz'
    a.data = 'a vot tak?'
    ses.add(a)

    ses.commit()

if __name__ == '__main__':
    main()
# ---- code end

It works only with real column instance...

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to