分层关系

来自Odoo大V社-odoo中文开发手册
7017511讨论 | 贡献2017年5月4日 (四) 05:55的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

通过Many2one关系可以在相同的模块中表现父子树关系,每条记录可以引用它的父类。相反的One2many让父类更容易跟踪它的子类。

odoo支持并优化了这种层级数据结构,以便更快的浏览树的兄弟节点,并且可以使用带child_of操作符的规则表达式使查询更容易。

这种特性生效,需要设置_parent_store标签属性并且添加模块的辅助字段:parent_left和parent_right。注意,这种操作会增加额外的存储和执行效率的开销,所以最好在你确认你的读操作远远比写操作更频繁时,再使用,比如树一类的场景。

重新改写todo_model.py文件中的Tags模块为:

class Tags(models.Model):
    _name = 'todo.task.tag'
    _description = 'To-do Tag'
    _parent_store = True
    # _parent_name = 'parent_id'
    name = fields.Char('Name')
    parent_id = fields.Many2one('todo.task.tag', 'Parent Tag', ondelete='restrict')
    parent_left = fields.Integer('Parent Left', index=True)
    parent_right = fields.Integer('Parent Right', index=True)

这里,我们又一个基本的模块,使用parent_id字段引用父记录,并且附加上_parent_store属性添加层级查询。这个时候,parent_left和parent_right字段就必须添加。

指定父类的字段通常命名为parent_id,但是其他的任何字段名字我们都可以自定义。

同时, 通常添加一个字段,直接访问子记录:

child_ids = fields.One2many('todo.task.tag', 'parent_id', 'Child Tags')
上一节:一对多反向关系 下一节:使用动态关系的参考字段