• odoo12 修行提升篇之 常用的高阶函数 (二)


    odoo中有很多封装好的方法,非常实用,开发中用的比较多的当属高阶函数了。

    当然使用的过程中通常与python原有的高阶函数结合。功能十分强大,可以有效的减少代码行数,提升可读性。

    直接上代码:

     1 # odoo高阶函数测试
     2 def test_high_order_func(self):
     3     records = self.env['my.customer.complain'].search([])
     4 
     5     # 记录对象.mapped()的用法
     6     # 获取所有记录的state字段
     7     print(records.mapped('state'))
     8     # ['done', 'done', 'cancel', 'done', 'done', 'done', 'draft', 'draft']
     9     print(records.mapped(lambda record: (record.name, record.state)))
    10     # [('MCC001', 'done'), ('MCC002', 'done'), ('MCC003', 'cancel'), ('MCC004', 'done')...]
    11 
    12     # 记录对象.filtered()的用法
    13     print(records.filtered(lambda record: record.state == 'draft'))
    14     # my.customer.complain(9, 10) -> 返回的是多个可迭代的记录对象,不是列表
    15 
    16     # 记录对象.sorted()的用法
    17     print(records.sorted(key=lambda record: record.name, reverse=True))
    18     # my.customer.complain(10, 9, 8, 7, 6, 5, 4, 3)
    19 
    20     # 可以多个方法连用
    21     print(records.filtered(lambda x: x.state == 'done').mapped('name'))
    22     # ['MCC001', 'MCC002', 'MCC004', 'MCC005', 'MCC006']
    23     print(records.filtered(lambda x: x.state == 'done').sorted(key=lambda x: x.name, reverse=True).mapped('name'))
    24     # ['MCC006', 'MCC005', 'MCC004', 'MCC002', 'MCC001']
    25 
    26     # 有的时候还想和Python的高阶函数连用
    27     print(sorted(records.mapped('name'), key=lambda x: x, reverse=True))
    28     # ['MCC008', 'MCC007', 'MCC006', 'MCC005', 'MCC004', 'MCC003', 'MCC002', 'MCC001']
    29 
    30     record_list = [record for record in records]
    31     # odoo自带的高阶函数,只能使用odoo本身的可迭代对象
    32     # 对于我们自己构建的列表,应使用Python原有的高阶函数
    33     # 以下情况均报错
    34     # print(record_list.mapped('id'))
    35     # print(record_list.filtered(lambda record: record.state == 'draft'))
    36     # print(record_list.sorted(key=lambda record: record.name, reverse=True))
    37     # -------- 错误分割线 --------
    38     print(map(lambda x: x.name, record_list))
    39     # <map object at 0x000001DFCF42E048>
    40     print(filter(lambda x: x.state == 'draft', record_list))
    41     # <filter object at 0x000001DFCF42E048>
    42     print(sorted(record_list, key=lambda x: x.name, reverse=True))
    43     # [my.customer.complain(10,), my.customer.complain(9,), my.customer.complain(8,)...]
    44     print([x for x in
    45            map(lambda x: x.name, sorted(filter(lambda x: x.state == 'draft', record_list), key=lambda x: x.name))])
    46     # ['MCC007', 'MCC008']
    47 
    48     # python原有的高阶函数可以处理odoo的记录集(不推荐)
    49     print(sorted(records, key=lambda x: x.name, reverse=True))
    50     # [my.customer.complain(10,), my.customer.complain(9,), my.customer.complain(8,)...]
    51     print(map(lambda x: x.name, records))
    52     # <map object at 0x00000295F9C5BF60>
    53     print(filter(lambda x: x.state == 'draft', records))
    54     # <filter object at 0x00000295F9C5BF60>

    需要注意的是,odoo的记录集可以使用odoo自带的高阶函数,不可以使用python原有的高阶函数,但python的原有的高阶函数,可以处理odoo的记录集。

    推荐使用odoo自带的高阶函数,因为,返回的结果集,可以直接用来进行例如write、update等操作,方便。

    git地址:https://github.com/SamNicole1809/odoo12_my_pro

  • 相关阅读:
    AJAX局部刷新
    jquery 调用数据
    java 节点流(字符流,字节流)和包装流(缓冲流,转换流)
    java File类的使用以及一些函数
    java 自定义泛型
    java 注解
    jdbc baseDAO 以及 每个类的继承
    jdbc 事物 commit 和rollback方法
    jdbc 可处理数据库事物的通用增删查改函数
    jdbc 数据库批处理insert操作
  • 原文地址:https://www.cnblogs.com/SamNicole1809/p/13684143.html
Copyright © 2020-2023  润新知