即使一个人,也要活得像军队一样!

在实际开发中,我们又是会遇到一些需求,以销售订单为例:
在销售订单明细中, 我们添加一行明细:产品为苹果。再添加一行明细时候,产品的下来选项就不能含有苹果的产品。
如下图:

去重

关键代码:

tools.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
from functools import reduce

def get_record_vals(self, model, domain):
"""
@author: LoneyCao 2019/12/14 9:30
@desc: 获取记录的字典。注意:只针对单条记录。
@params self: 实列
@params model: 模型名
@params domain: domain表达式
@return: 返回一个dict,包含记录的各字段值。
"""
vals_list = self.env[model].search_read(domain)
if vals_list:
vals = reduce(lambda x, y: dict(**x, **y), vals_list)
return vals
return False


def get_o2m_field_page_cach_val(self, o2m_model, o2m_val, field_list=None, field_map=None):
"""
@author: LoneyCao 2019/12/14 9:30
@desc: 编辑状态下,获取Form视图上O2M字段的当前记录
@params self: 实列
@params o2m_model: O2M字段关联的模型名
@params o2m_val: 当前编辑状态下,O2M字段的所有记录。如:[(0,0,{}),(1,30,{}),(2,31,False),(4,0,False)]
@params field_list: 字段列表,如果指定,则返回一个字段所有值的字典。如下所示:
field_list=[name, age]
return {'name': ['Alex', 'Tom', 'Jerry'], 'age': [20,30,30]}
注意:与参数field_map不可共存。
@params field_map: 字段映射,如果指定,则返回一个字段与字段的映射关系。如下所示:
field_map=[age, name]
return {'20': ['Alex'], '30': ['Tom', 'Jerry']}
注意:与参数field_list不可共存。
@return: 返回一个list,包含当前的记录
"""
records = [] # 当前编辑状态下的记录
for rec in o2m_val:
vals = {}
if rec[0] == 0: # 新增
vals = rec[2]
elif rec[0] == 1: # 修改
vals = get_record_vals(self, o2m_model, [('id', '=', rec[1])]) # 先获取原来记录
vals.update(rec[2]) if vals else False # 再更新
elif rec[0] == 4: # 不变
vals = get_record_vals(self, o2m_model, [('id', '=', rec[1])]) # 获取原来记录
if vals:
records.append(vals)

field_dict = {}

if field_list:
for field in field_list:
v_list = []
for rec in records:
v = rec.get(field)
if isinstance(v, tuple): # m2o类型字段
v = v[0]
if v:
v_list.append(v)
field_dict[field] = v_list

return field_dict

if field_map:
for rec in records:
k = rec.get(field_map[0])
v = rec.get(field_map[1])
if isinstance(k, tuple): # m2o类型字段
k = k[0]
if isinstance(v, tuple):
v = v[0]
if k and v:
if k in field_dict:
field_dict[k].append(v)
else:
field_dict[k] = [v]

return field_dict

return records
阅读全文 »

ir.actions.server的code字段可以赋值为一小段python代码,当执行该服务器动作时也会同时执行该段python代码,而如果这段python代码最后返回了一个窗口动作,则执行完服务器动作后也会执行该窗口动作。
注意: 动作窗口视图中如果缺少接收值action,则导致没有返回数据,页面不会跳转。
如下:

阅读全文 »

python中的浮点数精度问题

1
2
>>> 0.1 + 0.2
0.30000000000000004

我们不难发现python中浮点数的精度是存在问题的,这其中的原因是什么呢?
首先十进制的有理数表达是怎样的呢:

满足:
$\frac{x}{10^n}$,其中x≠∞, n∈N 的表达,自然而然二进制中有理数就满足$\frac{x}{2^n}$,其中x≠∞, n∈N

阅读全文 »

Python 偏函数是通过 functools 模块被用户调用。

偏函数 partial 应用

函数在执行时,要带上所有必要的参数进行调用。但是,有时参数可以在函数被调用之前提前获知。这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用。

偏函数是将所要承载的函数作为partial()函数的第一个参数,原函数的各个参数依次作为partial()函数后续的参数,除非使用关键字参数。

阅读全文 »

collections模块实现了特定目标的容器,以提供Python标准内建容器 dict、list、set、tuple 的替代选择。

  • Counter:字典的子类,提供了可哈希对象的计数功能
  • defaultdict:字典的子类,提供了一个工厂函数,为字典查询提供了默认值
  • OrderedDict:字典的子类,保留了他们被添加的顺序
  • namedtuple:创建命名元组子类的工厂函数
  • deque:类似列表容器,实现了在两端快速添加(append)和弹出(pop)
  • ChainMap:类似字典的容器类,将多个映射集合到一个视图里面
阅读全文 »

inspect模块主要提供了四种用处

1.对是否是模块、框架、函数进行类型检查

2.获取源码

3.获取类或者函数的参数信息

4.解析堆栈

一、type and members

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1). inspect.getmembers(object[, predicate]) 参数2调用如下16个方法;
# 返回值为object的所有成员,以(name,value)对组成的列表
2)inspect.getmembers()可以获取对象(module、classmethod等)属性

1.inspect.ismodule(object): 是否为模块
2.inspect.isclass(object): 是否为类
3.inspect.ismethod(object): 是否为方法(bound method written in python)
4.inspect.isfunction(object): 是否为函数(python function, including lambda expression)

5.inspect.isgeneratorfunction(object):是否为python生成器函数
6.inspect.isgenerator(object): 是否为生成器
7.inspect.istraceback(object): 是否为traceback
8.inspect.isframe(object): 是否为frame
9.inspect.iscode(object): 是否为code

10.inspect.isbuiltin(object): 是否为built-in函数或built-in方法
11.inspect.isroutine(object): 是否为用户自定义或者built-in函数或方法
12.inspect.isabstract(object): 是否为抽象基类
13.inspect.ismethoddescriptor(object):是否为方法标识符
14.inspect.isdatadescriptor(object): 是否为数字标识符,数字标识符有__get__ 和__set__属性;
通常也有__name__和__doc__属性
15.inspect.isgetsetdescriptor(object): 是否为getset descriptor
16.inspect.ismemberdescriptor(object):是否为member descriptor
阅读全文 »

写在前头,本来不打算写这些东西的,毕竟网上一大堆,官方文档一大堆。可是有些看官和徒弟不懂一些Python知识,讲解Odoo知识时候有些吃力,只能补充一下,写一写基础的。真人、神仙、佛祖级别的就自动略过。

关于Python的一些秘史啊,我们就扒一扒。那各位看官,就请搬板凳坐一排,且听我细细道来。

一、前戏

阅读全文 »