I noticed a problem with self referencing tables and option
lazy_tables=True. This is my code:
----- model -----
db.define_table('biography_available_award',
Field('title', label=T('biography_available_award__title')),
Field('parent_id', 'reference biography_available_award'),
Field('order_no', 'integer', writable=False, compute = lambda row: ...),
format='%(title)s'
)
----- controller -----
def awards():
...
awards =
db(db.biography_available_award.parent_id==None).select(orderby=db.biography_available_award.order_no)
...
It fails with error:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Traceback (most recent call last):
File "/home/donatas/ProCursus/projects/web2py/gluon/restricted.py", line 209,
in restricted
exec ccode in environment
File
"/home/donatas/ProCursus/projects/web2py/applications/bow/controllers/plugin_biography.py"
<http://localhost:8000/admin/default/edit/bow/controllers/plugin_biography.py>,
line 4788, in <module>
File "/home/donatas/ProCursus/projects/web2py/gluon/globals.py", line 185, in
<lambda>
self._caller = lambda f: f()
File "/home/donatas/ProCursus/projects/web2py/gluon/tools.py", line 2780, in f
return action(*a, **b)
File
"/home/donatas/ProCursus/projects/web2py/applications/bow/controllers/plugin_biography.py"
<http://localhost:8000/admin/default/edit/bow/controllers/plugin_biography.py>,
line 112, in awards
awards =
db(db.biography_available_award.parent_id==None).select(orderby=db.biography_available_award.order_no)
File "/home/donatas/ProCursus/projects/web2py/gluon/dal.py", line 7112, in
__getattr__
return self.lazy_define_table(tablename,*fields,**args)
File "/home/donatas/ProCursus/projects/web2py/gluon/dal.py", line 7071, in
lazy_define_table
table = table_class(self, tablename, *fields, **args)
File "/home/donatas/ProCursus/projects/web2py/gluon/dal.py", line 7452, in
__init__
field.requires = sqlhtml_validators(field)
File "/home/donatas/ProCursus/projects/web2py/gluon/dal.py", line 6303, in
sqlhtml_validators
referenced = db[field_type[10:]]
File "/home/donatas/ProCursus/projects/web2py/gluon/dal.py", line 7106, in
__getitem__
return self.__getattr__(str(key))
File "/home/donatas/ProCursus/projects/web2py/gluon/dal.py", line 7113, in
__getattr__
return ogetattr(self, key)
AttributeError: 'DAL' object has no attribute 'biography_available_award'
Now I use a workaround in models file:
db._lazy_tables = False
db.define_table('biography_available_award',
Field('title', label=T('biography_available_award__title')),
Field('parent_id', 'reference biography_available_award'),
Field('order_no', 'integer', writable=False, compute = lambda row: ...),
format='%(title)s'
)
db._lazy_tables = True
--