On Sep 27, 2009, at 12:49 PM, Yuen Ho Wong wrote:

>
> So I have this following code:
>
> class User(Base):
>     ....
>
>     class AgeComparator(PropComparator):
>
>     def __lt__(self, other):
>         pass
>
>     def __gt__(self, other):
>         pass
>
>     def __eq__(self, other):
>         pass
>
>     def __ne__(self, other):
>         return not (self == other)
>
>     def __le__(self, other):
>         return self < other or self == other
>
>     def __ge__(self, other):
>         return self > other or self == other
>
>     @comparable_using(AgeComparator)
>     @property
>     def age(self):
>         today = date.today()
>         age = today - (self.date_of_birth or (today + 1))
>         return age.days / 365
>
> All I want to do is this:
>
> user = User(date_of_birth=date.today())
> session.add(user)
> new_borns = session.query(User).filter(User.age == 0).all()
>
> The doc for comparable_property() suggests that this is possible, but
> I'm lost finding my way to call the descriptor bound on this instance.

The age(self): function is only called when you actually have an  
instance, such as:

user = sess.query(User).get(10)
print "age is: " , user.age

The point of @comparable_using associates the behavior of  
AgeComparator to the "age" attribute on the User class, no instance:

User.age == 0

User.age == 0 is going to invoke the __eq__() method on the  
AgeComparator you created.  There is no instance within the query()  
call here.   __eq__() needs to return a clause expression of your  
choosing, which must be expressed in terms of SQL functions, since  
you're rendering a SQL statement.   That's a little tricky here since  
there's a lot of date arithmetic there, but using hypothetical  
functions it would look something like:

def __eq__(self, other):
    return func.count_days(func.date_diff(func.now() -  
mapped_table.c.date_of_birth)) / 365

The comparable_using example should probably include a short  
PropComparator to give more context.  A sample comparator is at:

http://www.sqlalchemy.org/docs/05/mappers.html#custom-comparators



>
> The problem I have is that the ComparableProperty only gave itself and
> the mapper to the comparator, but the user instance is nowhere to be
> found inside either ComparableProperty, PropComparator or mapper. I'd
> appreciate some help here if this is at all possible. The documents on
> this is a little too sparse IMO.
>
> >


--~--~---------~--~----~------------~-------~--~----~
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