在定义之前在 web2py 中引用 table

Referencing a table in web2py before defining it

我的代码如下,我试图将部门分配给员工并在部门中创建经理 table

db = DAL(lazy_tables=True)
db.define_table('employee',
            Field('fullname','string',label='Name'),
            Field('email','string'),
            Field('phone','string'),
            Field('kids', 'string'),
            Field('phone', 'string'),
            #Field('date','datetime'),
            Field('dob', 'datetime', label='Date'),
            Field('department', 'reference department',
                  requires=IS_IN_DB(db, db.department.id, '%(department_name)s')),
            auth.signature,
            format='%(fullname)s'

            )
db = DAL(lazy_tables=True)
db.define_table('department',
            Field('department_name', 'string', label='Department Name'),
            # Field('department_name', 'string', label='Department Name'),
            Field('manager', 'reference employee', required='true',
                  requires=IS_IN_DB(db, db.employee.id, '%(fullname)s')),
            auth.signature,
            format='%(department_name)s'
            )
    Field('department', 'reference department',
          requires=IS_IN_DB(db, db.department.id, '%(department_name)s')),

在上面的行中,您引用了 db.department.id,但是 department table 尚未定义,因此 db 对象还没有 department属性。

您应该能够使用以下替代语法:

IS_IN_DB(db, 'department.id', '%(department_name)s')

或者,您可以在定义 department table 之后定义 requires 属性:

db.employee.department.requires = IS_IN_DB(db, db.department.id, '%(department_name)s')

如果删除第二个 db = DAL(lazy_tables=True),应该没问题。

您遇到的问题是,在第一个 table 定义(员工)之后,您实际上用 declaring/instantiating 覆盖了第一个数据库对象。

这为您提供了一个新的数据库对象(未定义 tables),您在其中定义了一个 table(部门),该 table(部门)引用了另一个不再存在。