好的,我们用一个更通俗的例子来解释不同模块之间的模型关联,场景是“学校和学生”的例子。
1. 场景介绍
假设我们有两个模块:
- 学校模块 (
school
):用于管理学校信息。 - 学生模块 (
student
):用于管理学生信息。
每个学校可以有多个学生,而每个学生只属于一个学校,这就是一个典型的 Many2one 和 One2many 的关联场景。
2. 定义学校模型(school
模块)
在 school
模块中,我们定义了 School
模型,用来表示每个学校的信息。
# school/models/school.py
from odoo import models, fields
class School(models.Model):
_name = 'school.school'
_description = 'School'
name = fields.Char(string="School Name")
student_ids = fields.One2many('student.student', 'school_id', string="Students")
name
字段是学校的名称。student_ids
是一个One2many
字段,表示该学校下所有的学生,它通过student.student
模型中的school_id
字段来关联。
3. 定义学生模型(student
模块)
接下来,在 student
模块中定义 Student
模型,用来表示每个学生的信息,并通过 Many2one
关联到 School
模型。
# student/models/student.py
from odoo import models, fields
class Student(models.Model):
_name = 'student.student'
_description = 'Student'
name = fields.Char(string="Student Name")
school_id = fields.Many2one('school.school', string="School")
name
字段是学生的姓名。school_id
是一个Many2one
字段,用来关联到school.school
模型,这表示每个学生属于某个学校。
4. 模块之间的依赖
为了让 student
模块能够使用 school
模块中的 School
模型,你需要在 student
模块的 __manifest__.py
文件中添加对 school
模块的依赖:
# student/__manifest__.py
{
'name': 'Student Management',
'version': '1.0',
'depends': ['school'], # 添加对 school 模块的依赖
'data': [
'views/student_views.xml',
],
}
这告诉 Odoo 系统,student
模块依赖于 school
模块,所以在安装 student
模块之前,必须先安装 school
模块。
5. 视图展示
最后,你可以在 student
模块中定义一个表单视图,用来输入和查看学生信息,包括学生所属的学校。
<!-- student/views/student_views.xml -->
<record id="view_student_form" model="ir.ui.view">
<field name="name">student.form</field>
<field name="model">student.student</field>
<field name="arch" type="xml">
<form string="Student">
<sheet>
<group>
<field name="name"/>
<field name="school_id"/>
</group>
</sheet>
</form>
</field>
</record>
在这个视图中,用户可以选择学生所属的学校。
6. 总结
在这个例子中,我们展示了如何在不同模块之间建立模型的关联:
- 学校模块 (
school
) 定义了School
模型,包含一个One2many
字段student_ids
,用于表示学校下的多个学生。 - 学生模块 (
student
) 定义了Student
模型,并使用Many2one
字段school_id
关联到School
模型,表示每个学生属于某个学校。