One2many(一对多)关联场景中,如何从模型(一)关联到模型(多)的某个字段
好的,我们用一个更通俗的例子来解释不同模块之间的模型关联,场景是“学校和学生”的例子。
1. 场景介绍
假设我们有两个模块:
- 学校模块 (school):用于管理学校信息。
- 学生模块 (student):用于管理学生信息。
每个学校可以有多个学生,而每个学生只属于一个学校,这就是一个典型的 Many2one 和 One2many 的关联场景。
2. 定义学校模型(school 模块)
 
在 school 模块中,我们定义了 School 模型,用来表示每个学校的信息。
# school/models/school.pyfrom odoo import models, fieldsclass 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.pyfrom odoo import models, fieldsclass 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模型,表示每个学生属于某个学校。
