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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---