+1
On Jul 22, 7:08 pm, "mr.freeze" <[email protected]> wrote: > Assuming you meant: > r.y.y.y.t > It works because db.a.y is a self referencing field. Inserting into > db.a doesn't return an int, but a Reference, which has a __getattr__ > that returns the record it references. Any number of y's should work: > r.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.t > 't' is the virtual field which returns the length of the computed > field, which in turn is 3*x. 'x' in this case is 'hello', so t is 15. > You could also do: > r.y.y.y.y.z > to get the computed field which should return: > hellohellohello > > On Jul 22, 6:50 pm, "mr.freeze" <[email protected]> wrote: > > > It shouldn't. It should throw an error at the print statement because > > 'a' is not defined. > > > On Jul 22, 6:33 pm, mdipierro <[email protected]> wrote: > > > > The following code uses: > > > 1) a computed field > > > 2) a self reference > > > 3) a virtual field > > > > >>> db.define_table('a',Field('x'),Field('y','reference > > > >>> a'),Field('z',compute=lambda row: row['x']*3)) > > > >>> class A: > > > >>> def t(self): return len(self.a.z) > > > >>> db.a.virtualfields.append(A()) > > > >>> r=db.a.insert(x='hello') > > > >>> r.update_record(x=r.x,y=r) > > > >>> print a.y.y.y.y.t > > > > 15 > > > > Can you explain how it works?

