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
    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, 8)
        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, 8)
        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: =, !=, &gt;, &gt;=, &lt;, &lt;=, 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



  • 南京-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, 8)
        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, 8)
        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: =, !=, &gt;, &gt;=, &lt;, &lt;=, 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



  • parent_left, parent_right 在这里作为 operator 是怎么工作的

    这个之前真没注意到,谢谢ccdos的分享和buke的解疑。



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



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



  • 好像明白了



  • 2014-07 Tommy 又针对 parent_left, parent_right 做了一些测试:

    详见 群聊天记录:
    http://69195329.qqlog.mrshelly.com/20140730.html#138423



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



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


登录后回复
 

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