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等操作,方便。