我们来深刻地理解一下在 Odoo 18 开发中如何以及为何要使用“中间模型”来满足各种复杂的业务需求。
在 Odoo 中,中间模型是连接另外两个模型的桥梁,它本身也是一个完整的模型。它最经典的应用场景是为多对多(Many2many)关系添加额外的信息。
1. 从标准的 Many2many 关系说起
首先,我们理解一下 Odoo 中最基础的多对多关系。假设我们有两个模型:Course(课程)和 Student(学生)。一个学生可以参加多门课程,一门课程也可以被多个学生参加。
模型定义 (student.py & course.py):
# models/student.py
from odoo import models, fields
class Student(models.Model):
_name = 'res.partner' # 为方便演示,我们直接继承 partner 模型
_inherit = 'res.partner'
# 一个学生可以参加多门课程
course_ids = fields.Many2many(
'course.course', # 关联的模型
'student_course_rel', # 数据库中自动创建的中间表的名称
'student_id', # 在中间表中代表本模型记录的字段名
'course_id', # 在中间表中代表关联模型记录的字段名
string='Enrolled Courses'
)
# models/course.py
from odoo import models, fields
class Course(models.Model):
_name = 'course.course'
_description = 'Course'
name = fields.Char(string='Course Name', required=True)
# Odoo 会自动处理反向关系,但为了明确,我们也可以定义
student_ids = fields.Many2many(
'res.partner',
'student_course_rel',
'course_id',
'student_id',
string='Students'
)
视图定义 (course_views.xml):
<record id="course_view_form" model="ir.ui.view">
<field name="name">course.form</field>
<field name="model">course.course</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="name"/>
</group>
<notebook>
<page string="Students">
<field name="student_ids"/>
</page>
</notebook>

最低0.47元/天 解锁文章
158

被折叠的 条评论
为什么被折叠?



