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

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

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

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

odoo 中 |= 是什么意思



  • 最近在研究 odoo 源码时遇到了一个问题,在 odoo 中 |= 是什么意思啊


  • 管理员

    这是集合操作符号:
    SetA |= SetB 等同于 SetA = SetA | SetB

    即:集合的或操作

    Odoo中的RecordSet也是集合的概念,所以可以使用集合操作符



  • move_waiting = self.env['stock.move']

        for move in self:
            if move.move_orig_ids:
                move_waiting |= move
    

    这是odoo仓库的部分源码,move_waiting 是recordSet。但是 move 是单条记录,不是 recordset,这两个能进行 |= 吗


  • 管理员

    都是recordSet, recordSet的子集也是recordSet



  • 这我可能有点不理解,我原来是做Java的,我站在我这分析下你看对吗。recordSet在Java中可以理解为List,就是move_waiting 是 List,move 是 RecordSet 里的一条记录,那就是 List 里的一条记录。如果是这样的话,List 和另一个 List里的记录不能进行 | 操作吧。你看我这样理解对吗



  • 东莞-neter(627785244) 10:10:22
    odoo新api中强调的是recordset,
    什么时候,什么操作如果遵循他的规范都会得到一个recordset,
    只不过这个recordset可能包含一个,或者几个记录,对于有一个记录的可以直接进行属性操作。
    但本质上还是个recordset。所以很绕,一般初次接触的会很容易给搞蒙。
    Rs = env['xxxx'],是个recordset,只不过为空。
    rs = Rs.browse(xxxx),是个recordset。
    rs[0],是个recordset, rs.browse('xxxxx')此时rs也可以像Rs一样browse,
    如果此时你用java的类可以new实例,但是实例不能new实例,
    这就是odoo和java思想的区别。问题的核心在于_browse函数。读懂了就全懂了。


  • 管理员

    recordSet并不是列表,而是一个对象,这个对象具有集合(set)的属性。
    简单理解recordSet是列表是不对的。



  • @火灬炎灬焱灬燚

    Iterating on a recordset will yield new sets of a single record ("singletons"), much like iterating on a Python string yields strings of a single characters.

    这是odoo文档的原话,她说:“遍历recordset集合得到的是(单记录的set)子集合(还是集合);这非常像 当遍历一个字符串时,每次得到一个(单字符的串)”。所以不管是‘’单字符‘’字符串还是子集合,依然拥有字符串或集合的所有特性。

    回到你的例子,“ for move in self ”: 遍历了self(recordset集合),move每次得到的是单记录的子集合set,而self也是集合(set),自然而然两个能进行 |=


登录后回复
 

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