Odoo ORM研究2 - BaseModel中的常用方法分析

今天继续研究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)
    • 数据改动的时候触发的方法。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容