On Tue, 2013-01-22 at 09:26:35 +0200, Alexey Vihorev wrote:
> 1. Does SQLA support "deep filtering", i.e. something like this:
> 
> query(Invoice).filter(Invoice.Customer.Country.name=='France')
> 
> This does not work as it is, but is there something along this lines (except
> of going with query.filter(.query.filter(.query.filter(query.get()))))?

SQLAlchemy tries to follow SQL closely, hence the "SQL" in its name.  So
it's helpful to think in terms of SQL when trying to construct a query.
In this case you would need to use JOINs:

  # Assuming that you have all these tables with properly defined
  # relations.
  session.query(Invoice).join(Customer, Country).\
      filter(Country.name == u'France')

> 2.Can I use hybrid properties for filtering? I tried to do that, but that's
> what I got:
> 
> class Person(Base):
>     first_name = Column(String(50))
>     last_name = Column(String(50))
> 
>     def __init__(self, first, last):
>         self.first_name = first
>         self.last_name = last
> 
>     @hybrid_property
>     def full_name(self):
>         print(self.first_name, self.last_name)
>         return self.first_name + " " + self.last_name
> 
> p = Person('John', 'Doe')
> s.commit()
> res = s.query(Person).filter(Person.full_name=='John Doe').all()
> 
> output:
> 
> Person.first_name Person.last_name
> []
> 
> Apparently, Person.full_name receives a class as an argument instead of an
> instance. Is there other way?

That's what you want in this case, that this hybrid property would get a
class, because Query works with classes.  Try adding echo=True to
create_engine() to see the actual SQL emitted, it should be correct.

In your example you forgot to add newly created p object to a session:

  s.add(p)
  s.commit()

Your Person class is missing __tablename__ as well.

-- 
Audrius Kažukauskas
http://neutrino.lt/

Attachment: pgp5HoNMwVzps.pgp
Description: PGP signature

Reply via email to