关于 parent_left, parent_right
- 
南京-ccdos(1431494) 22:04:54 
 parent_left 或者right?
 我至今没搞懂
 前些天 问了一下,没回应
 上海-空无一人(2158691) 22:05:07
 我也在看。。。
 苏州-秋风流云(154363268) 22:05:13
 <record model="ir.actions.act_window" id="action_ziyuan_allfdcrm">
 <field name="name">所有客户资源</field>
 <field name="res_model">ziyuan.fdcrm</field>
 <field name="domain">[('state','!=','draft'),('x_fuzr.parent_id.user_id','=',uid)]</field>
 </record>
 南京-ccdos(1431494) 22:05:26
 关键也没列子
 深圳-老刘(15251908) 22:11:28
 这个不算嵌套,只是 多了几个条件
 上海-空无一人(2158691) 22:13:18
 所以刚刚那个该怎么写呢 找出当前hr.employee所属department的直接上级department下面所有的hr.employee.
 这个domain要怎么写。。。
 南京-ccdos(1431494) 22:15:22
 “department”,“ child of”,"userid .id.department.parent"
 上海-空无一人(2158691) 22:17:21
 谢谢 我试试看
 广州-步科(17779104) 22:22:24
 parent_left parent_right 是用来计算子节点,避免递归
 如 product.category 的定义:
 _columns = {
 'name': fields.char('Name', size=64, required=True, translate=True, select=True),
 'complete_name': fields.function(_name_get_fnc, type="char", string='Name'),
 'parent_id': fields.many2one('product.category','Parent Category', select=True, ondelete='cascade'),
 'child_id': fields.one2many('product.category', 'parent_id', string='Child Categories'),
 'sequence': fields.integer('Sequence', select=True, help="Gives the sequence order when displaying a list of product categories."),
 'type': fields.selection([('view','View'), ('normal','Normal')], 'Category Type', help="A category of the view type is a virtual category that can be used as the parent of another category to create a hierarchical structure."),
 'parent_left': fields.integer('Left Parent', select=1),
 'parent_right': fields.integer('Right Parent', select=1),
 }
 南京-ccdos(1431494) 22:23:39
 谢谢步科
 我不明白的是,parent_left parent_right 还是 domain 的一个 运算符,就搞不懂了
 广州-步科(17779104) 22:23:45
 假如没有parent_left 和parent_right ,读子节点必须通过 parent_id 递归计算
 有parent_left parent_right之后,计算就非常简单
 如有以下记录结构:
 Customers (1, 10)
 Consumers (2, 3)
 Partners (4, 9)
 Basic Partners (5, 6)
 Gold Partners (7, 
 Suppliers (11, 12)
 广州-步科(17779104) 22:24:58
 加入要读 Customers 的子节点:
 SELECT id FROM partner_category
 WHERE parent_left > 1 AND parent_left < 10
 这样就可以了
 parent_left 和 parent_right 中在domain 使用也是同样道理
 上海-空无一人(2158691) 22:25:28
 1, 10 在这里是什么意思?
 广州-步科(17779104) 22:25:47
 Customers (1, 10) 第一个是left 第二个是 right
 深圳-老刘(15251908) 22:26:06
 看懂了,左右边界
 南京-ccdos(1431494) 22:26:09
 下级 节点的范围
 上海-空无一人(2158691) 22:26:46
 范围是事先定义好的?
 还是动态变化的?
 广州-步科(17779104) 22:26:54
 其实 parent_left 和parent_right 避免递归的话,把计算压力提前了,在创建和删除记录会重新计算
 南京-ccdos(1431494) 22:26:58
 插入时 计算
 广州-步科(17779104) 22:27:24
 以空间换时间,很经典的思路
 上海-空无一人(2158691) 22:28:28
 那left和right的区别是什么?
 有一个不就能搞定了么
 广州-步科(17779104) 22:28:38
 左右边界呀
 上海-稀饭(591958938) 22:28:39
 左右
 广州-步科(17779104) 22:28:48
 仔细观察:
 如有以下记录结构:
 Customers (1, 10)
 Consumers (2, 3)
 Partners (4, 9)
 Basic Partners (5, 6)
 Gold Partners (7, 
 Suppliers (11, 12)
 上海-空无一人(2158691) 22:28:52
 加入要读 Customers 的子节点:
 SELECT id FROM partner_category
 WHERE parent_left > 1 AND parent_left < 10
 应该是 parent_left>1 parent_right<10?
 广州-步科(17779104) 22:29:39
 呵呵,我错了,你是对的
 深圳-老刘(15251908) 22:29:39
 都在 1到10范围
 上海-空无一人(2158691) 22:30:07
 这里的1~10都是值id 》
 ?
 指的是id?
 广州-步科(17779104) 22:30:25
 对
 这种用法有一定的局限性,比如经常有插入删除场景中就不适用,计算量也不小。
 OE 用的也不多
 上海-空无一人(2158691) 22:31:22
 主数据上用用蛮好
 以查询为主
 'parent_left': fields.integer('Left Parent', select=1),
 'parent_right': fields.integer('Right Parent', select=1), 这些都是系统自带的字段?
 广州-步科(17779104) 22:32:22
 account.account
 product.cat
 stock.location
 等这些都是读的场景多
 南京-ccdos(1431494) 22:33:08
 * operator must be a string with a valid comparison operator from this list:=, !=, >, >=, <, <=, like, ilike, in, not in, child_of, parent_left, parent_right
 The semantics of most of these operators are obvious.
 @广州-步科 我想请教, parent_left, parent_right 在这里作为 operator 是怎么工作的 ?
 上海-空无一人(2158691) 22:33:15
 向 write_uid一样 可以直接用?
 广州-步科(17779104) 22:41:18
 domain 最终都是转成SQL 语句的,作为 operator 也是一样:
 如 [(id, parent_left, 1)] == parent_left > 1
 [(id, parent_right, 10)] == parent_right < 10
 其实就是转为 parent_left > 1 AND parent_right < 10


