模型关联
一个模型中的记录可能关联到另一个模型中的记录。例如,销售订单记录会关联到一个包含客户数据的客户记录中;同时销售订单记录也会关联到销售订单明细记录。
练习建立一个授课模型
在开放学院模块中,我们考虑一个授课模型:一个授课是在给定的时间中对给定的受众教授指定的课程。为授课建立模型,授课包括名称、开始时间、持续时间和席位数。添加操作和菜单项来显示新的模型。
- 在
openacademy/models/models.py
文件中创建Session类 - 在
openacademy/view/openacademy.xml
文件中添加访问授课对象的菜单和操作
openacademy/models.py
name = fields.Char(string="Title", required=True)
description = fields.Text()
class Session(models.Model):
_name = 'openacademy.session'
name = fields.Char(required=True)
start_date = fields.Date()
duration = fields.Float(digits=(6, 2), help="Duration in days")
seats = fields.Integer(string="Number of seats")
openacademy/views/openacademy.xml
session.form
openacademy.session
Sessions
openacademy.session
form
tree,form
注意
digits=(6,2)
指定浮点数的精度:6是数字的总和,而2是小数位长度,这同时表明整数位的最大长度是4
关联字段
关联字段链接同一模型(不同层次结构)或者不同模型之间的记录。关联字段有三种类型:
Many2one(other_model, ondelete='set null')
一个链接到其它对象的简单示例是这样的:
print foo.other_id.name
One2many(other_model, related_field)
这是一个虚拟的关联,是Many2one
的逆,One2many
作为记录的容器,访问它将返回一个记录集(也可能是一个空记录集):
for other in foo.other_ids:
print other.name
警告
因为One2many
是一个虚拟关联,所以必须有一个Many2one
字段存在于other_model
,其名称也必须是related_field
Many2many(other_model)
双向多对多关联,一方的任一记录可以与另一方的任意数量记录关联。作为记录的容器,访问它也可能导致返回空记录集
for other in foo.other_ids:
print other.name
练习Many2one关联
编辑Course和Session模型以反映他们与其它模型的关联:
- 课程有一个负责的用户;该字段的值是内置模型
res.users
的记录 - 一个授课有一个教师;该字段的值是内置模型
res.partner
的记录 - 授课与课程相关;该字段的值是
openacademy.course
模型的记录,并且是必填项 - 在模型中添加
Many2one
关联,并在视图显示
openacademy/models.py
name = fields.Char(string="Title", required=True)
description = fields.Text()
responsible_id = fields.Many2one('res.users',
ondelete='set null', string="Responsible", index=True)
class Session(models.Model):
_name = 'openacademy.session'
start_date = fields.Date()
duration = fields.Float(digits=(6, 2), help="Duration in days")
seats = fields.Integer(string="Number of seats")
instructor_id = fields.Many2one('res.partner', string="Instructor")
course_id = fields.Many2one('openacademy.course',
ondelete='cascade', string="Course", required=True)
openacademy/views/openacademy.xml
course.tree
openacademy.course
session.tree
openacademy.session
Sessions
openacademy.session
练习逆关联One2many
使用逆关联字段one2many,编辑模型以反映课程和授课之间的关系。
- 编辑
Course
类,并且加入字段到它的表单视图
openacademy/models.py
responsible_id = fields.Many2one('res.users',
ondelete='set null', string="Responsible", index=True)
session_ids = fields.One2many(
'openacademy.session', 'course_id', string="Sessions")
class Session(models.Model):
openacademy/views/openacademy.xml
练习多对多关联many2many
在授课模型中添加关联字段many2many,将每次授课和参与的听众做关联,听众来自于内置模型res.partner
。相应的调整对应的视图。
- 修改
Session
类并且加入字段到它的表单视图中
openacademy/models.py
instructor_id = fields.Many2one('res.partner', string="Instructor")
course_id = fields.Many2one('openacademy.course',
ondelete='cascade', string="Course", required=True)
attendee_ids = fields.Many2many('res.partner', string="Attendees")
openacademy/views/openacademy.xml