On Nov 13, 2012, at 3:34 AM, tonthon wrote:

> Hi,
> 
> I'm using polymorphism for some of my models and I'm wondering how I
> should use the with_polymorphic query method.
> 
> Consider the following:
> """
> class A(Base):
>   type_ = Column(Integer, nullable=False)
>   arg = Column(String(20))
>  __mapper_args__ = {'polymorphic_on': type_, 'polymorphic_identity': 0}
> 
> class B(A):
>    __mapper_args__ = {'polymorphic_identity': 1}
> 
> class C(A):
>    __mapper_args__ = {'polymorphic_identity': 2}
> 
> class D(A):
>    __mapper_args__ = {'polymorphic_identity': 3}
> """
> 
> When I query :
> 
> """
> session.query(A).with_polymorphic([B,C]).filter(A.arg == 'test')
> """
> 
> I get D elements in my result.
> I've tried :
> 
> """
> session.query(A).with_polymorphic([B,C]).filter(or_(B.arg=='test',
> C.arg=='test'))
> """
> 
> But it doesn't work neither.
> 
> Could somebody explain me what I did wrong and how I should do ?

with_polymorphic() is generally only useful with joined table inheritance (note 
this is single table inheritance), and is used to add those subclass tables to 
the Query so that you can filter() on their criterion, as well as to allow more 
columns to be pulled in via a single query rather than needing to invoke 
additional queries for subclass tables.  It does not indicate a subset of 
subclasses to be included.

If you want to load A's of type B, C, but not D, you'd need to do this manually 
via the discriminator - since B, C and D are all As you normally will get back 
all three as the rows determine.

session.query(A).filter(A.type_.in(0, 1, 2))


-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@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