Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

关于 parent_left, parent_right



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



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



  • parent_left, parent_right 在这里作为 operator 是怎么工作的<br /><br />这个之前真没注意到,谢谢ccdos的分享和buke的解疑。



  • 在物料分类中看到了,更关注“多级BOM”时的应用,再研究...



  • 我在制造业,一些成衣企业从纱开始操作(多赚一点,但压资金厉害),衣服布料(染整后,裁剪前的状态)可以有“子料(坯布)”和“孙料(纱)”,而可以有各自的BOM用量、损耗等,有点挑战。



  • 好像明白了



  • 2014-07 Tommy 又针对 parent_left, parent_right 做了一些测试:<br /><br />详见 群聊天记录: <br />http://69195329.qqlog.mrshelly.com/20140730.html#138423<br />



  • 以前做过个 PPT 详细讲过这个问题,这是专用于关系数据库存储层次数据的 nested sets 数据结构。<br />参考附件



  • 很棒的PPT,这类分享很适合技术大会


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待