> -----Original Message----- > From: sqlalchemy@googlegroups.com [mailto:sqlalchemy@googlegroups.com] > On Behalf Of Jules Stevenson > Sent: 09 June 2011 08:53 > To: sqlalchemy@googlegroups.com > Subject: [sqlalchemy] Re: Trying to query a relationship of a > relationship > > Sorry, for the spamming, code typo (was trying to simplify it), > should read: > > invoices = query(ArkInvoice).\ > join(ArkInvoice.project).\ > join(ArkProject.client).\ > > options(sa.orm.contains_eager(ArkInvoice.project.client)).\ > filter(ArkInvoice.project.client.id == id) >
I think you probably want something like this (all untested): invoices = (session.query(ArkInvoice) .join(ArkInvoice.project) .join(ArkProject.client) .filter(ArkClient.id == id)).all() If you need contains_eager (which is purely an optimisation allowing you to access invoice.project without a subsequent query), I think it would look like this: invoices = (session.query(ArkInvoice) .join(ArkInvoice.project) .join(ArkProject.client) .options(contains_eager(ArkInvoice.project), contains_eager(ArkProject.client)) .filter(ArkClient.id == id) .all()) However, if you are actually going to be working with the client, project and invoice objects after this query, you may find it easier to start from the client: client = (session.query(ArkClient) .options(joinedload_all('projects.invoices')) .filter(ArkClient.id == id) .one()) After this query, you could access client.projects and client.projects[n].invoices without further database queries. See http://www.sqlalchemy.org/docs/orm/loading.html for a description of joinedload_all. I hope that helps, Simon -- 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.