We need to work on the speed. This can perhaps help the syntax: db=DAL() db.define_table('a',Field('b','integer')) for i in range(10): db.a.insert(b=i)
def lazy(f): def g(self,f=f): import copy self=copy.copy(self) return lambda *a,**b: f(self,*a,**b) return g class Scale: @lazy def c(self,scale=1): return self.a.b*scale db.a.virtualfields.append(Scale()) for row in db(db.a).select(): print row.b, row.c(1), row.c(2), row.c(3) On Aug 1, 3:10 pm, Michael Toomim <too...@gmail.com> wrote: > Maybe it helps for me to explain my use-case. I mainly use virtual fields as > lazy methods, to help traverse related tables. I was actually surprised that > lazy evaluation wasn't the default. I noticed a few implications of this: > - Large queries are slowed by virtualfields, even if they won't be needed, > esp if they query db > - My definitions for virtualfields aren't as clean as they could be, > because I have many nested "lazy" funcs in the class definition > - We can't serialize all objects into session variables > > So really I'm just using this because it's a nicer notation to call > row.otherthing() instead of getotherthing(row). Maybe I really want some > different feature here? > > On Aug 1, 2011, at 5:40 AM, Anthony Bastardi wrote: > > > > > > > > > Note, after looking at this some more, Massimo recalled that the reason > > auth_user virtual fields were excluded from auth.user (and therefore from > > saving in the session) is because some virtual fields are objects that > > cannot be pickled and therefore cannot be serialized to store in the > > session. So, we're thinking of either creating an option to store auth_user > > virutual fields in auth.user, or maybe testing to make sure the virtual > > fields can be pickled, and excluding them if not. > > > Anthony > > > On Mon, Aug 1, 2011 at 5:30 AM, Michael Toomim <too...@cs.washington.edu> > > wrote: > > Awesome! I did not know there was an issue submission system. > > > On Jul 30, 2011, at 7:02 AM, Anthony wrote: > > >> An issue has been submitted, and this should be corrected soon. > > >> Anthony > > >> On Friday, July 29, 2011 9:57:30 PM UTC-4, Anthony wrote: > >> auth.user is Storage(table_user._filter_fields(user, id=True)). The > >> _filter_fields method of the auth_user table only selects actual table > >> fields, not virtual fields, so auth.user will not include any virtual > >> fields. Perhaps this should be changed. > > >> Anthony > > >> On Friday, July 29, 2011 9:05:39 PM UTC-4, Michael Toomim wrote: > >> I think I found a bug in virtualfields. I have the following > >> controller: > > >> def posts(): > >> user = session.auth.user > >> n = user.name # returns None > > >> Where "person" is defined as a virtualfield on user: > > >> class Users(): > >> def name(self): > >> return self.users.first_name + ' ' + self.users.last_name > >> db.users.virtualfields.append(Users()) > > >> The problem is that user.name returns None, because apparently the > >> virtualfield isn't loaded into the session variable of user. > > >> I made this work with the following modification to the controller: > > >> def posts(): > >> user = db.users[session.auth.user.id] > >> n = user.name # returns the user name correctly! > > >> I just had to refetch the user from the database.