3.模型关联
True

3.1.模型关联

一个模型中的记录可能关联到另一个模型中的记录。例如,销售订单记录会关联到一个包含客户数据的客户记录中;同时销售订单记录也会关联到销售订单明细记录。

练习

#建立一个授课模型
在开放学院模块中,我们考虑一个授课模型:一个授课是在给定的时间中对给定的受众教授指定的课程。为授课建立模型,授课包括名称、开始时间、持续时间和席位数。添加操作和菜单项来显示新的模型。

  • openacademy/models/models.py文件中创建Session
  • openacademy/view/openacademy.xml文件中添加访问授课对象的菜单和操作

openacademy/models.py


已复制
   openacademy/views/openacademy.xml
已复制
 注意

digits=(6,2)指定浮点数的精度:6是数字的总和,而2是小数位长度,这同时表明整数位的最大长度是4

3.2.关联字段

关联字段链接同一模型(不同层次结构)或者不同模型之间的记录。关联字段有三种类型:
Many2one(other_model, ondelete='set null')

定义:mto = fields.Many2one("关联对象 _name", string="字段显示名",...)
可选参数:ondelete,可选值为‘cascade’和‘null’,缺省为null。表示one端删除时many端是否级联删除。
一个链接到其它对象的简单示例是这样的:

已复制
many2one是用来建立两个表之间的关联的,必须在子表里定义一个字段(实体表里也会生成这个字段),指向主表的model
例如:coursesession的关联里,session子表的model里就要定义一个course_id,指向主表的一条记录。
一个session里只能有一个course,一个course里有多个session
course_id = fields.Many2one('openacademy.course',ondelete='cascade'string="Course", required=True)

设置当引用的record被删除时,如果对本record进行的行为,可填:set null,restrict,cascade

则当对模型b进行delete操作时,会引发如下操作

set null: 当b中删除记录时,modelA中相关记录的a=null

cascade: 当b中删除记录时,modelA中相关记录也全部删除

restrict: 当b中删除记录时,如果modelA中存在对应记录,则无法操作 b 的删除

默认是: set null

One2many(other_model, related_field)
定义:otm = fields.One2many("关联对象 _name", "关联字段",string="字段显示名",...)
例:analytic_line_ids = fields.One2many('account.analytic.line', 'move_id', string='Analytic lines')"
这是一个虚拟的关联,是Many2one的逆,One2many作为记录的容器,访问它将返回一个记录集(也可能是一个空记录集):
已复制

one2many是一个虚拟关系,定义了也不会在实体表里创建字段的。在主表里定义,指向明细表的model,并且必须指定明细表里定义的和主表相关联的字段。必须先定义many2one之后才能定义one2many。

例如:course主表里可以定义一个session_ids代表子表的一个集合。

session_ids = fields.One2many('openacademy.session', 'course_id', string="Sessions")

因为One2many是一个虚拟关联,所以必须有一个Many2one字段存在于other_model,其名称也必须是related_field

Many2many(other_model)

定义:mtm = fields.Many2many("关联对象 _name", "关联表/中间表","关联字段1","关联字段2",string="字段显示名",...)
其中,关联字段、关联表/中间表可不填,中间表缺省为:表1_表2_rel
例:partner_id= fields.Many2many("res.partner", string="字段显示名",...)"
双向多对多关联,一方的任一记录可以与另一方的任意数量记录关联。作为记录的容器,访问它也可能导致返回空记录集


已复制

many2many会创建一个两个实体表的主键的新的关联表。关联表为两个实体表名加_rel。
例如:session里定义一个出席者的字段。一个session里可以有多个  Attendees,一个attendee也存在于
多个session里,这时就要定义两个表的关联关系表。
attendee_ids = fields.Many2many('res.partner', string="Attendees")


练习

#Many2one关联
编辑CourseSession模型以反映他们与其它模型的关联:

  • 课程有一个负责的用户;该字段的值是内置模型res.users的记录
  • 一个授课有一个教师;该字段的值是内置模型res.partner的记录
  • 授课与课程相关;该字段的值是openacademy.course模型的记录,并且是必填项
  • 在模型中添加Many2one关联,并在视图显示

openacademy/models.py


已复制
openacademy/views/openacademy.xml,
已复制

练习

 #逆关联One2many

使用逆关联字段one2many,编辑模型以反映课程和授课之间的关系。

  • 编辑Course类,并且加入字段到它的表单视图

openacademy/models.py


已复制
openacademy/views/openacademy.xml
已复制

练习

 #多对多关联many2many

在授课模型中添加关联字段many2many,将每次授课和参与的听众做关联,听众来自于内置模型res.partner。相应的调整对应的视图。

  • 修改Session类并且加入字段到它的表单视图中

openacademy/models.py


已复制
openacademy/views/openacademy.xml
已复制
                                


1.构建odoo模块
True