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

posted @ 2020-09-17 11:26  御简  阅读(668)  评论(0编辑  收藏  举报