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

-- 



Reply via email to