这可能是一个愚蠢的问题,我已经读过这个:http://web2py.com/books/default/chapter/29/06#One-to-many-relation
但是我仍然无法理解数据库声明出错的地方。
这是我希望我的表格看起来像布局,包括引用和所有内容:
这是我在db.py
中使用的web2py代码db.define_table('Course',Field('CallNumber','integer'),Field('Section','string',),Field('Title','string'),Field('MinCredit','integer'),Field('MaxCredit','integer'),Field('MaxEnrollment','integer'),Field('CurrentEnrollment','integer'),Field('Status','string'),Field('Instructor1','string'),Field('Term','string'))
db.define_table('Meeting',Field('CallNumber',db.Course),Field('Day','string'),Field('StartTime','string'),Field('EndTime','string'),Field('Site','string'),Field('Building','string'),Field('Room','string'),Field('Activity','string'))
db.define_table('Requirement',Field('CallNumber',db.Course),Field('Control','string'),Field('Argument','string'),Field('Value1','string'),Field('Operator','string'),Field('Value2','string'))
我要做的是确保Meeting和Requirement表引用回课程表而不是web2py在Course表中分配条目的任意id,而是通过CallNumber引用。
任何帮助将不胜感激。感谢。
答案 0 :(得分:2)
引用字段存储引用表的主键,即id
字段。如果您想要引用记录的CallNumber值,则可以在进行连接时轻松获取它:
db.define_table('Course', Field('CallNumber', 'integer'), ...)
db.define_table('Meeting', Field('Course', db.Course), ...)
row = db(db.Course.id == db.Meeting.Course).select().first()
print row.Course.CallNumber
您还可以执行recursive select:
row = db(db.Meeting).select().first()
print row.Course.CallNumber
注意,循环选择在循环多个记录时效率较低,因为它为每个记录执行单独的数据库查询。在这种情况下,上面的内连接方法更有效,因为它只涉及一个查询来检索整个连接记录集。