Notice that Virtualfields do not need any knowledge of the db object. You can declare the class in a module (not model). Import the module and then apply them to the tables that need them.
On Aug 19, 6:03 pm, Massimo Di Pierro <massimo.dipie...@gmail.com> wrote: > You asked for it so here they are: built-in lazy virtual fields. > > Q. How do they work? > > A. Like normal virtual fields but no need to mess up with lambdas, > etc. Just add a @staticmethod decorator. Here is an example: > > db=DAL() > db.define_table('x',Field('number','integer')) > if db(db.x).isempty(): [db.x.insert(number=i) for i in range(10)] > > class MyVirtualFields(object): > > # normal virtual > field > def normal_shift(self): return self.x.number+1 > > # lazy virtual field (because of > @staticmethod) > @staticmethod > def lazy_shift(self,delta=4): return self.x.number+delta > > db.x.virtualfields.append(MyVirtualFields()) > > for row in db(db.x).select(): > print row.number, row.normal_shift, row.lazy_shift(delta=7) > > normal_shift is a normal virtual field > lazy_shift is a lazy virtual field (the name is accidental, you can > use any names of course). > > There is a conceptual difference. In the former case self.x is > <instance>.<attribute> while in the latter self.x is <row>.<attribute> > as there is no instance needed. > > This should be faster that some of the hacks we have attempted in the > past and should not consume more memory than needed. There are no > copies of objects when using only virtual fields. > > Enjoy!