odoo11 model+Recordset 基础未完待续

时间:2022-05-03 03:00:04

Model

一个模型代表了一个业务对象

本质上是一个类,包含了同django flask一样的数据字段 所有定义在模型中的方法都可以被模型本身的直接调用

现在编程范式有所改变,不应该直接访问模型,而是应该使用记录集 (RecordSet)

要实例化一个模型,你必须要继承openerp.model.Model 同Django Flask 实例代码:

from openerp import models, fields, api, _

class MyModel(models.Model):

    _name = 'a.model'  # 模型名称会被用作数据库表名

    firstname = fields.Char(string="Firstname")

model继承

继承机制使用_inherit 示范代码:

class MyModelExtended(Model):
_inherit='a.model' #直接继承
_inherit=['a.model','a.other.model'] #直接继承
_inherit={'a.model':'field_name'} #多重继承

注意:可以单独修改某个字段的某个或多个属性

name = field.Char(string='New Value')

记录集 (Recordset)

所有模型在init中实例,同时这个实例也是对应记录集的实例.一个记录集表达了对应模型的经过排序的记录的集合

class AModel(Model):
#...
def a_func(self):
self.do_something() #这里self是一个记录集,介于类(class)与集合(set)之间的混合体
record_set = self
record_set.do_something()
def do_something(self):
for record in self:
print(record)

在运行这段代码时, self变量实际上是包含了很多记录的一个记录集的实例.

所以传入do_something的self是一个包含一系列记录的记录集.

如果使用@api.one装饰一个方法的话,它会遍历当前记录集的记录,此时的self就是当前这条记录.

注意:如果记录集只含有一条记录,你把这个装饰器用在该记录集上会导致中断!! (If you use it on a RecordSet it will break if recordset does not contains only one item.!!)

是否还是对record的值不理解,我也是先继续看吧.后面还有细讲的!!!!!!!!!!

支持的操作

类似集合的 联合,交,补等运算 ,属于 不属于

record in recset1       # 属于
record not in recset1 # 不属于
recset1 + recset2 # 扩展(extend)
recset1 | recset2 # 联合(union)
recset1 & recset2 # 交集(intersect)
recset1 - recset2 # 差补/相对补集(difference)
recset.copy() # 记录集的浅复制(被复制对象的所有变量都含有与原来的对象相同的值,而其所有的对其他对象的引用都仍然指向原来的对象)

只有 + 保留原集合的顺序

排序:

sorted(recordset, key=lambda x: x.column)example

对数据库的读和写

使用api的写 Active Record模式

设置属性(setting properties) 来写入数据库

record = self
record.name = 'new name'

此方法会更新缓存中的值并调用写方法来触发想数据库的写入动作

Active Record模式 注意事项 最主要是会导致高负载 范例:

@api.one
def dangerous_write(self):
self.x = 1
self.y = 2
self.z = 4

因为调用了api.one 对记录集里的每个记录的写操作都会被调用3次,name乳沟你的记录集有10条记录,一共会哟30次写操作

这早高负载任务里会导致性能问题.需要改写成如下:不调用api比较好

def better_write(self):
for rec in self:
rec.write({'x': 1, 'y': 2, 'z': 4}) # 或者 def better_write2(self):
# 给所有记录赋相同值
self.write({'x': 1, 'y': 2, 'z': 4})

空查询 (Browser_null) 链

空关系现在返回一个空的记录集

当查询的是字段是一个具有很多关联的,且值为空,这些关系都会被关联,最后返回一个空的记录集

环境 (Environment)

这里的环境 指的是对 记录指针(cursor)、用户id(user_id)、模型(model)、上下文(context)、记录集(Recordset)和缓存(cache)的封装。

odoo11 model+Recordset 基础未完待续

于是乎,odoo11就不用传很多参数了

# 以前
def afun(self, cr, uid, ids, context=None):
pass # 现在
def afun(self):
pass

访问环境的示范:

def afun(self):
self.env
# 或者
model.env

环境应该是不可变的,不能在方法里进行修改,因为它还存储着记录集的缓存等等信息。

修改环境

修改当前的上下文,需要使用with_context()方法:

self.env['res.partner'].with_context(tz=x).create(vals)

改变用户

环境提供了一个切换用户的辅助方法:

self.sudo(user.id)
self.sudo() # 缺省会使用 SUPERUSER_ID
# 或者
self.env['res.partner'].sudo().create(vals)

访问当前用户

self.env.user

使用XML id获取记录

self.env.ref('base.main_company')

清理环境缓存

由于我们的odoo中存在很多缓存,有用于模型,字段等类.

有时候可以使用记录指针 (cursor) 来直接插入/写数据,这种情况下需要将这些缓存无效:

self.env.invalidate_all()

一般动作(Common Actions)

搜索

变化如下 ps 官方宣称的域(domain)的变动没有在8.0版本里实现

search 方法直接返回一个记录集:

>>> self.search([('is_company', '=', True)])
res.partner(7, 6, 18, 12, 14, 17, 19, 8,...) #返回的记录集
>>> self.search([('is_company', '=', True)])[0].name
'Camptocamp'

使用env调用search:

>>> self.env['res.users'].search([('login', '=', 'admin')])
res.users(1,)

search_read

新功能search_read 功能:执行search并返回一个字典(dict)列表(list).

示范:获取所有合作伙伴的名称:

>>> self.search_read([], ['name'])
[{'id': 3, 'name': u'Administrator'},
{'id': 7, 'name': u'Agrolait'},
{'id': 43, 'name': u'Michel Fletcher'},
...]

search_count

search_count 方法返回符合搜索域(domain) 定义的记录数量:

>>> self.search_count([('is_company', '=', True)])
26L

检索

检索是从数据获取记录的标准方法.现在检索会返回一个记录集:

>>> self.browse([1, 2, 3])
res.partner(1, 2, 3)

写入

使用 Active Record 模式

@api.one
def any_write(self):
self.x = 1
self.name = 'a'

从记录写入

@api.one
...
self.write({'key': value })
# 或者
record.write({'key': value})

从记录集写入

@api.multi
...
self.write({'key': value })
# 它将写入到所有记录里
self.line_ids.write({'key': value })

多对多(Many2many) 一对多(One2many) 写入行为

未完待续`````````

odoo11 model+Recordset 基础未完待续的更多相关文章

  1. HTTP协议基础(未完待续)

    一.超文本传输协议 超文本传输协议(Hypertext Transfer Protocol,HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数据通信的基础. 设计HT ...

  2. 2017-2-17,c#基础,输入输出,定义变量,变量赋值,int.Parse的基础理解,在本的初学者也能看懂(未完待续)

    计算机是死板的固定的,人是活跃的开放的,初学c#第一天给我的感觉就是:用人活跃开放式的思维去与呆萌的计算机沟通,摸清脾气,有利于双方深入合作,这也是今晚的教训,细心,仔细,大胆 c#基础 1.Hell ...

  3. CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)

    目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...

  4. ASP.NET Core 2.2 基础知识(八) 主机 (未完待续)

    主机负责应用程序启动和生存期管理.共有两个主机 API : 1.Web 主机 : 适用于托管 Web 应用,基于 IWebHostBuilder ; 2.通用主机 : 适用于托管非 Web 应用. 基 ...

  5. java泛型基础、子类泛型不能转换成父类泛型--未完待续

    参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...

  6. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  7. ASP&period;NET MVC 系列随笔汇总&lbrack;未完待续……&rsqb;

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  8. MVC丶 &lpar;未完待续&&num;183&semi;&&num;183&semi;&&num;183&semi;&&num;183&semi;&&num;183&semi;&&num;183&semi;&rpar;

         希望你看了此小随 可以实现自己的MVC框架     也祝所有的程序员身体健康一切安好                                                     ...

  9. &lbrack;python&rsqb;爬代理ip v2&period;0&lpar;未完待续)

    爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...

随机推荐

  1. vuejs动态组件给子组件传递数据

    vuejs动态组件给子组件传递数据 通过子组件定义时候的props可以支持父组件给子组件传递数据,这些定义的props在子组件的标签中使用绑定属性即可,但是如果使用的是<component&gt ...

  2. Web服务器禁止range请求

    range: 请求一般是多线程下载的客户端程序使用 在httpd.conf中增加下面的配置,可以禁止range请求: RewriteEngine onRewriteCond %{HTTP:Range} ...

  3. 用asp&period;net c&num; HttpWebRequest获取网页源代码

    public string GetPage(string url) { HttpWebRequest request = null; HttpWebResponse response = null; ...

  4. Python学习路程day6

    shelve 模块 shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式 import shelve d = shelve.open ...

  5. Machine Learning 学习笔记 &lpar;1&rpar; —— 线性回归与逻辑回归

    本系列文章允许转载,转载请保留全文! [请先阅读][说明&总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 梯度下降法 (Gradien ...

  6. struts2配置文件中action的name属性

    struts2配置文件中action的name属性的第一个字符不要加斜杠 <action name="see" class="baoxiuManage_seeAct ...

  7. 高通 android平台LCD驱动分析

    目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...

  8. pycharm实用快捷键集锦

    以下是本人需要记录的快捷键,并不针对大众,所以是断断续续补充的,大家看看图个乐呵就成! 生成代码块(Surround with):Ctrl + Alt + t . 历史浏览页面跳转:很多时候,我们需要 ...

  9. 开始写博客,学习Linq(4)

    应该是可以敲代码了,Linq是.NET Framework3.5的功能,该版本的框架同时发布了新增的和更新了得类库,也为C#和VB.NET语言提供了新版本的编译器.Linq的功能支持源于编译器和类库, ...

  10. SQL Server 2016最值得关注的10大新特性

    全程加密技术(Always Encrypted) 全程加密技术(Always Encrypted)支持在SQL Server中保持数据加密,只有调用SQL Server的应用才能访问加密数据.该功能支 ...