zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    设计模式的原则
    List是线程安全的吗?如果不是该怎么办呢?安全的List对性能的影响有多大呢?
    StringBuilder是不是线程安全的?
    并行运算和普通运算之性能比较
    分布式与集群的区别
    sql查询性能分析
    C#代码实现,确保windows程序只有一个实例(instance)
    jQuery UI
    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo
    整理的一些学习网站资料
  • 原文地址:https://www.cnblogs.com/SamNicole1809/p/13684143.html
Copyright © 2011-2022 走看看