Hi all,
I don't get the following errors and results. My goal is to have a virtual
field and i can't get it to work the way i want it - and what i think is
described in the book as it should work. What am i doing wrong here?
Below are serveral independent samples of what i thought had to work,
though old_style_virtual_field_test2 will never work and is obvious.
Thanks for helping out.
Remco Boerma
# web2py 2.9.5-stable+timestamp.2014.03.16.02.35.39
def new_style_virtual_field_test():
db = DAL('sqlite:memory',pool_size=1)
db.define_table('myorder',
Field('a','integer'),
Field('b','integer')
)
db.myorder.c = Field.Virtual(lambda row:row.a * row.b)
db.myorder.insert(a=2,b=3)
return db().select(db.myorder.ALL).first().as_json()
# {"a": 2, "id": 1, "b": 3}
# where is c?
return db().select(db.myorder.a, db.myorder.b,
db.myorder.c).first().as_json()
# <class 'sqlite3.OperationalError'> no such column: None.unknown
# (self=<gluon.dal.SQLiteAdapter object>, *a=('SELECT myorder.a,
myorder.b, None.unknown FROM myorder;',), **b={})
# where has my C field gone to?
def old_style_virtual_field_test1():
db = DAL('sqlite:memory',pool_size=1)
db.define_table('myorder',
Field('a','integer'),
Field('b','integer')
)
class MyVirtualFields(object):
def c(self):
return self.myorder.a * self.myorder.b
db.myorder.virtualfields.append(MyVirtualFields())
db.myorder.insert(a=2,b=3)
# return db().select(db.myorder.ALL).first().as_json()
# {"a": 2, "id": 1, "b": 3}
# where is c?
return db().select(db.myorder.a, db.myorder.b,
db.myorder.c).first().as_json()
# AttributeError: 'Table' object has no attribute 'c'
# it doesn't ? I thought i declared to be virutally present
def old_style_virtual_field_test2():
db = DAL('sqlite:memory',pool_size=1)
db.define_table('myorder',
Field('a','integer'),
Field('b','integer')
)
class MyVirtualFields(object):
def c(self):
return self.myorder.a * self.myorder.b
db.myorder.setvirtualfields(myorder=MyVirtualFields())
# <type 'exceptions.AttributeError'> 'Table' object has no attribute
'setvirtualfields'
# maybe a bit more clarity in the documentation would be nice. I
understand the purpose
# but it's easily overlooked.
def old_style_virtual_field_test3():
db = DAL('sqlite:memory',pool_size=1)
db.define_table('myorder',
Field('a','integer'),
Field('b','integer')
)
class MyVirtualFields(object):
def c(self):
return self.myorder.a * self.myorder.b
db.myorder.insert(a=2,b=3)
rows = db(db.myorder).select()
# now i have to apply them after selecting? That's counter intuitive
# i thought it would be in the model, not the controller
rows.setvirtualfields(myorder=MyVirtualFields())
# also note the setvirtualfields has to be applied to the rows, not to
a single row.
return rows.first().as_json();
# {"a": 2, "c": 6, "b": 3, "id": 1}
# yeey!!
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.