Works great for me On Tuesday, February 21, 2017 at 2:56:58 PM UTC-6, Shane Carey wrote: > > I understand from the docs and several questions both here and on > bitbucket that cascading polymorphism is not supported. This > is what it says on the docs: > > Warning > > Currently, *only one discriminator column may be set*, typically on the > base-most class in the hierarchy. “Cascading” polymorphic columns are not > yet supported. > > > However, the following experiment works for me > > > from sqlalchemy import * > > from sqlalchemy.orm import * > > from sqlalchemy.ext.declarative import declarative_base > > import json > > > Base = declarative_base() > > > class Top(Base): > > __tablename__ = 'top' > > > id = Column(Integer, primary_key=True) > > type = Column(String(8), nullable=False) > > > __mapper_args__ = { > > 'polymorphic_on': type, > > 'with_polymorphic': '*' > > } > > > def dict(self): > > return { > > 'id': self.id > > } > > > class Primary(Top): > > __tablename__ = 'primary' > > > id = Column(None, ForeignKey(Top.id), primary_key=True) > > type = Column(String(8), nullable=False) > > > __mapper_args__ = { > > 'polymorphic_identity': 'primary', > > 'polymorphic_on': type, > > 'with_polymorphic': '*' > > } > > > def dict(self): > > return { > > 'type': self.type, > > **super().dict() > > } > > > class One(Primary): > > __tablename__ = 'one' > > > id = Column(None, ForeignKey(Primary.id), primary_key=True) > > one = Column(String(32), nullable=False) > > > __mapper_args__ = { > > 'polymorphic_identity': 'one' > > } > > > def dict(self): > > return { > > 'one': self.one, > > **super().dict() > > } > > > class Two(Primary): > > __tablename__ = 'two' > > > id = Column(None, ForeignKey(Primary.id), primary_key=True) > > two = Column(String(32), nullable=False) > > > __mapper_args__ = { > > 'polymorphic_identity': 'two' > > } > > > def dict(self): > > return { > > 'two': self.two, > > **super().dict() > > } > > > class Secondary(Top): > > __tablename__ = 'secondary' > > > id = Column(None, ForeignKey(Top.id), primary_key=True) > > type = Column(String(8), nullable=False) > > > __mapper_args__ = { > > 'polymorphic_identity': 'secondary', > > 'polymorphic_on': type, > > 'with_polymorphic': '*' > > } > > > def dict(self): > > return { > > 'type': self.type, > > **super().dict() > > } > > > class Three(Secondary): > > __tablename__ = 'three' > > > id = Column(None, ForeignKey(Secondary.id), primary_key=True) > > three = Column(String(32), nullable=False) > > > __mapper_args__ = { > > 'polymorphic_identity': 'three' > > } > > > def dict(self): > > return { > > 'three': self.three, > > **super().dict() > > } > > > class Four(Secondary): > > __tablename__ = 'four' > > > id = Column(None, ForeignKey(Secondary.id), primary_key=True) > > four = Column(String(32), nullable=False) > > > __mapper_args__ = { > > 'polymorphic_identity': 'four' > > } > > > def dict(self): > > return { > > 'four': self.four, > > **super().dict() > > } > > > if __name__ == '__main__': > > e = create_engine('sqlite:///poly_casc.db', echo=True) > > > Base.metadata.drop_all(e) > > Base.metadata.create_all(e) > > > s = create_session(e) > > > s.begin() > > > s.add_all([One(one='one'), Two(two='two'), Three(three='three'), > Four(four='four')]) > > > s.commit() > > > for m in s.query(Top).all(): > > print(json.dumps(m.dict(), indent=4)) > > print(type(m)) > > > s.expunge_all() > > > for m in s.query(Primary).all(): > > print(json.dumps(m.dict(), indent=4)) > > print(type(m)) > > > s.expunge_all() > > > for m in s.query(One).all(): > > print(json.dumps(m.dict(), indent=4)) > > print(type(m)) > > > so I am wondering if the docs needed to be updated, or I am missing > something regarding the functionality. > > > Thanks >
-- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.