今天继续研究 ORM 的 BaseModel, 昨天研究了一下所有常用属性的具体用法, 那么今天研究一下 BaseModel 中一些常用的方法, 我们学会它们并灵活的应用它们, 可以为我们开发解决很多的问题.
odoo ORM 的 4 大将 - 增删改查 (非常重要)
增 - create 方法
- @API.model_create_multi
- @API.returns('self', lambda value: value.id)
- def create(self, vals_list):
- # vals_list 是一个列表数据, 循环根据列表数据的内容创建数据, 返回数据对象.
- """
- ....
- """
重写 create 方法可以实现我们想要的在创建前后做一些自己想要做的工作.
删 - unlink 方法
- def unlink(self):
- # self 是需要删除数据的对象.
- """
- ....
- """
重写 unlink 的方法, 可以在删除数据的前后可以做一些自己的工作.
改 - write 方法
- def write(self, vals):
- # self 是需要修改数据的对象.
- # vals 是一个字典数据, key 是需要修改的字段的名称, value 是修改之后的值.
- """
- ....
- """
重写 write 的方法可以实现在对指定数据字段修改的时候的前后做出自己的动作.
查 - search 方法
- @API.model
- @API.returns('self',
- upgrade=lambda self, value, args, offset=0, limit=None, order=None, count=False: value if count else self.browse(value),
- downgrade=lambda self, value, args, offset=0, limit=None, order=None, count=False: value if count else value.ids)
- def search(self, args, offset=0, limit=None, order=None, count=False):
- # agrs, 其实就是 domain 过滤条件.
- # offset, 分页数据, 多少号数据开始.
- # limit, 数量量, offset 和 limit 一起可以用来数据分页操作.
- # count, 如果 count=True, 只会返回 search 到的数据的数量.
- """
- ....
- """
重写 search() 方法可以做到自由的在查询的时候做一些自己的操作.
总结
其实重写这 4 个方法, 在 odoo 的创建的时候肯定可以解决 90% 以上的问题.
重点注意的就是 API.mode 的装饰器使用, 如果基础方法使用了装饰器, 那么重写的时候也一定要加上装饰器.
Odoo ORM Search 家族
一个帮助 odoo 实现数据查询的家族
这个家族主要成员 (常用的方法)
browse(self, ids=None)
查询指定 ids 的数据.
这里 ids 是一个列表, 其实就是数据库数据的主键 id 数据的列表.
返回: records 对象集.
search(self, args, offset=0, limit=None, order=None, count=False)
根据指定条件查询数据.
上面有详细的用法.
返回: records 对象集.
search_count(self, args)
查询数据个数.
args 就是 domain 过滤方法.
返回: int 类型数量.
name_search(self, name='', args=None, operator='ilike', limit=100)
获取数据的 display_name 集合.
配合 name_get 使用, 可以修改 xml 调用 display_name 的具体显示.
返回: 列表数据 [(id, displayname)...].
name_get(self)
根据 self 的对象内容返回 [(id, name), ...]
read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
在数据分组的时候会使用, 如果数据分组的时候需要做操作可以改写这个方法.
返回: 列表中嵌套字典的数据.
其他对象查询方法
read(self, fields=None, load='_classic_read')
可以根据 self 的对象序列化数据返回.
fields, 一个列表数据, 将要序列化的数据字段给写进入, 默认是所有.
返回: 一个序列化数据 [{'字段名称': "字段值", ...}....].
filtered(self, func)
根据 func 的内容, 进行对 records 对象进行过滤 列: lambda r: not r.id.
返回: records 对象列表.
filtered_domain(self, domain)
在 records 对象列表的基础之上进行再次过滤.
返回: 一个新的 records 的对象列表.
fields_get(self, allfields=None, attributes=None)
获取 field 的具体内容描述, 如果想在 python field 将字段 readonly=True, 重写这个方法就可以实现.
Odoo ORM Create 家族
主要家族成员 (常用方法)
create(self, vals_list)
创建数据库数据, 这里上上面已经详细讲解过了, 这里就不做详细解释了.
name_create(self, name)
通过_rec_name 来创建 record 对象.
调用 create 的方法, 根据传参 name 的值到_rec_name 进行创建数据.
返回: name_get() 的值或者 False.
new(self, values={}, origin=None, ref=None)
创建新的虚拟数据的方法.
这个方法不会写入到数据库中, 只会在缓存中创建数据.
其他 create 的的方法
copy(self, default=None)
copy 数据, 创建新的一条新的数据.
返回一条新的 recode.
Odoo ORM Write 家族
update(self, values):
更新数据 values 也是 key value 的方式一样.
write(self, vals)
更新数据到数据库, update 其实最后还是调用了 write 的方法进行更新数据.
Odoo ORM Unlink 家族
unlink(self)
删除数据, 在上面也有详细讲解.
其他方法可能会用到
ensure_one(self)
判断数据是否为只有一个, 只要不是一个那么就会抛出异常.
exists(self)
判断这个 self 对象是否存在.
view_init(self, fields_list)
新建 form 视图的时候会走到这个方法.
load(self, fields, data)
加载数据矩阵, 导入数据的时候会加载这个方法.
default_get(self, fields_list)
获取 default 的值.
在创建 form 数据的时候会调用这个方法.
这里还会调用 view_init() 的方法.
user_has_groups(self, groups)
判断当前用户是否拥有指定 groups 组, 返回 True 或 False.
load_views(self, views, options=None)
加载视图, 通过传参 views.
配合_context 可以针对不同的页面显示自己想要的视图.
fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
控制视图的展示样式.
这个方法重写可以根据自己的需求在代码中修改一些视图的信息.
返回一个字典数据来控制视图.
get_formview_id(self, access_uid=None)
根据 record 对象获取 form 视图的 id.
get_formview_action(self, access_uid=None)
获取 form 视图的 action 动作, 用来渲染视图.
clear_caches(cls)
清除缓存.
with_env(self, env)
给自己的 record 的对象添加新的 env.
sudo(self, flag=True)
以 superuser 的方式返回对象.
with_user(self, user)
以指定新的用户返回对象.
with_context(self, *args, **kwargs):
给 record 的对象添加新的上下文.
sorted(self, key=None, reverse=False)
按 id 进行排序 record 对象的内容.
flush(self, fnames=None, records=None)
刷新数据, 更新数据库的数据.
refresh(self):
删除缓存数据.
recompute(self, fnames=None, records=None):
重新计算指定字段的数据.
onchange(self, values, field_name, field_onchange)
数据改动的时候触发的方法.
来源: http://www.bubuko.com/infodetail-3800478.html