Thank you Simon. I think you're right. I should better ask another question, instead of enrolling XY problem here (in short I need to add particular filter to each model).
But let's wrap up with this one. Did I understand correctly that I *cannot* have two following things simultaneously: 1. polymorphic_identity on base class; 2. automatic filter on polymorphic_on for base class; Thanks, Dmytro пт, 21 черв. 2019 о 16:42 Simon King <si...@simonking.org.uk> пише: > The extra base class is only needed once per inheritance hierarchy. Do > you have a hundred of those? Do you mind if I ask what kind of data > you are storing, and how you are structuring your class hierarchy? > > Thanks, > > Simon > > On Fri, Jun 21, 2019 at 1:30 PM Dmytro Starosud <d.staro...@gmail.com> > wrote: > > > > Thanks for your reply! > > > > > you could probably insert another class as the parent of A1, with no > polymorphic identity. > > > > This is what I would like to avoid. Otherwise I would need to write some > metaclass machinery to inject base class for all hundred models I have. > > Originally I am going to add this __mapper_args__ via mixin with > declared_attr. > > > > пʼятниця, 21 червня 2019 р. 15:08:47 UTC+3 користувач Simon King написав: > >> > >> From a quick test, this appears to be special behaviour for the base > >> class in an inheritance hierarchy. If you extend your test like this: > >> > >> from sqlalchemy import Column, Integer, String > >> from sqlalchemy.ext.declarative import declarative_base > >> from sqlalchemy.orm import Query, configure_mappers > >> > >> Base = declarative_base() > >> > >> class A1(Base): > >> __tablename__ = 'a1' > >> id = Column(Integer, primary_key=True) > >> poly_on = Column(String, nullable=False) > >> __mapper_args__ = { > >> 'polymorphic_on': poly_on, > >> 'polymorphic_identity': 'a1', > >> } > >> > >> class A2(A1): > >> __mapper_args__ = { > >> 'polymorphic_identity': 'a2', > >> } > >> > >> class A2a(A2): > >> __mapper_args__ = { > >> 'polymorphic_identity': 'a2a', > >> } > >> > >> class A2b(A2): > >> __mapper_args__ = { > >> 'polymorphic_identity': 'a2b', > >> } > >> > >> if __name__ == '__main__': > >> for cls in [A1, A2, A2a, A2b]: > >> print('#' * 10) > >> print(cls) > >> print(Query(cls)) > >> > >> > >> ...then the output looks like this: > >> > >> ########## > >> <class '__main__.A1'> > >> SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on > >> FROM a1 > >> ########## > >> <class '__main__.A2'> > >> SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on > >> FROM a1 > >> WHERE a1.poly_on IN (:poly_on_1, :poly_on_2, :poly_on_3) > >> ########## > >> <class '__main__.A2a'> > >> SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on > >> FROM a1 > >> WHERE a1.poly_on IN (:poly_on_1) > >> ########## > >> <class '__main__.A2b'> > >> SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on > >> FROM a1 > >> WHERE a1.poly_on IN (:poly_on_1) > >> > >> > >> In other words, if you query for A1, you will get every row from the > >> table, even if the polymorphic identity doesn't match any subclasses. > >> This makes sense if you think of every row in the table as being some > >> kind of (possibly specialized) A1. > >> > >> However, if you query for A2, you will only get rows that are > >> specifically A2, A2a or A2b. > >> > >> If you don't want this behaviour, you could probably insert another > >> class as the parent of A1, with no polymorphic identity. At that > >> point, I think queries for A1 would include "WHERE poly_on IN ('a1', > >> 'a2')". > >> > >> Hope that helps, > >> > >> Simon > >> > >> > >> On Fri, Jun 21, 2019 at 12:22 PM Dmytro Starosud <d.st...@gmail.com> > wrote: > >> > > >> > Base class A1 contains polymorphic_identity (along with > polymorphic_on), but Query(A1)doesn't produce where clause, whereas > Query(A2) (where A2 is subclass of A1 with its own polymorphic_identity) > does. > >> > > >> > Tried looking in docs with no success. I think I am just missing > something. > >> > > >> > from sqlalchemy import Column, Integer, String > >> > from sqlalchemy.ext.declarative import declarative_base > >> > from sqlalchemy.orm import Query, configure_mappers > >> > > >> > Base = declarative_base() > >> > > >> > > >> > class A1(Base): > >> > __tablename__ = 'a1' > >> > id = Column(Integer, primary_key=True) > >> > poly_on = Column(String, nullable=False) > >> > __mapper_args__ = { > >> > 'polymorphic_on': poly_on, > >> > 'polymorphic_identity': 'a1', > >> > } > >> > > >> > > >> > class A2(A1): > >> > __mapper_args__ = { > >> > 'polymorphic_identity': 'a2', > >> > } > >> > > >> > > >> > configure_mappers() > >> > > >> > print(Query(A1)) > >> > # SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on > >> > # FROM a1 > >> > > >> > print(Query(A2)) > >> > # SELECT a1.id AS a1_id, a1.poly_on AS a1_poly_on > >> > # FROM a1 > >> > # WHERE a1.poly_on IN (:poly_on_1) > >> > > >> > I would expect WHERE clauses in both cases. > >> > > >> > > >> > Originally posted here. > >> > > >> > -- > >> > 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 sqlal...@googlegroups.com. > >> > To post to this group, send email to sqlal...@googlegroups.com. > >> > Visit this group at https://groups.google.com/group/sqlalchemy. > >> > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/941f0c3e-e541-4554-8b4a-570c28afec64%40googlegroups.com > . > >> > For more options, visit https://groups.google.com/d/optout. > > > > -- > > 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. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/37e43d97-94ec-4669-9147-4568545186a4%40googlegroups.com > . > > For more options, visit https://groups.google.com/d/optout. > > -- > 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. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/CAFHwexegOMLGF8-h_yPD%2BAqGBGh1kC9Bjp475qAH9oa%3DdPQoMA%40mail.gmail.com > . > For more options, visit https://groups.google.com/d/optout. > -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/CANC2W%2BCD24Qnibw3q1ustQ4czsifYs4Vs0c3iHCQx1RM2M92ug%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.