基于odoo 12.0
odoo中的模型,一个很重要的特点就是,它即是定义模型的类,又是数据记录的集合,这一特性可以很方便的在模型中直接定义数据记录集的操作。例如赋值、修改、删除、计算等等。这些特性都需要odoo提供的ORM API来实现,具体方式是在函数定义前加上API的装饰器。
@api.one:表示确定只有一条记录,模型类函数中self代表一条数据集,可直接采用self.<字段名>进行增查改删的操作吗,但是官方不提倡使用api.one装饰器
@api.multi:表示多条记录,此时函数的self代表的是一个数据集,通常可采用 for record in self 来循环对数据集操作,也可以使用self.ensure_one()函数达到api.one的目的。
@api.model:类装饰器,这里的self就不再是数据集,而是类本身,相当于python中的@classmethod,@api.model装饰器不能用于按钮的点击操作逻辑函数,应使用api.multi
@api.depends:用于计算字段,形式为@api.depends(‘field1’,‘field2’…),用于标示哪些字段参与了计算字段的计算,同时函数内计算字段必须被赋值,否则会报错
@api.constraints:用于评估和检查,使用形式同@api.depends,若记录修改时,检查不通过,则不会修改记录
@api.onchange:用于用户在交互时自动更新关联字段,self指的是一条记录,可返回一个报告修改信息字典{‘title’:‘message title’,‘message’:‘message body’}
odoo-bin shell -d (数据库名) -c /etc/odoo/odoo.conf #ubuntu or debian系统
python odoo-bin shell -d (数据库名) #windows系统
进入shell后,输入命令:>>>self
res.users(1,)
>>>self._name
'res.users'
>>>self.name
'Administrator'
shell中的self即为管理员账户,shell中可以通过env函数查询数据集:>>>self.env['res.users'].search([],limit=1)#通过模块名查找,如果不加limit=1,返回结果是一个列表
res.users(1,)
>>>self.env['sale.order'].browse()#通过模块名查找
res.users(1,)
>>>self.env.ref('base.user_root')#通过外部ID查找
res.users(1,)
self.env种包含了如下几个属性:
通过ORM API来执行数据库相关的操作:
self.env.cr.execute(sql) #直接执行sql语句
self.env.cr.commit() #用于提交本次事物
self.env.cr.savepoint() #设置一个保存点用于回滚(rollback)
self.env.cr.rollback() #取消当前操作,回滚到上次提交的点或者上一个保存点
示例:
>>>self.env.cr.execute('select id,login from res_users where login=%s or id=%s'.format('demo',1))
>>>self.env.cr.fetchall()
[(1,'admin'),(5,'demo')]
使用方法与其他的数据库orm api(pymysql,pyodbc等)类似。
此外,还可以运行数据库操作命令(DML),但odoo保存的是数据缓存,与数据库中的数据可能会不一致,因此在使用原是DML时,应该在完成后使用self.env.invalidate_all()清空这些缓存。
{'lan':'en_US','tz':'Europe/Brussels','uid':1}
服务器端,记录集可的字段值可以依赖context提供的本地设置,为服务器端提供一些信号信息。
当从一个窗体通过点击一个俺就打开另一个窗体时,关键字active_id(active_ids)将会加载到context中,记录了上一个窗体定位的记录id。active_model则记录的视图模型的技术名称。这在业务向导中经常用到。
例如在向导中要获取上一个记录的记录集,在对筛选的记录集在下一个窗体进行操作。实现过程为:在按钮的点击事件函数中,通过需要用到default_get()方法
@api.model
def default_get(self,feild_names):
defaults = super(ModelClass,self).default_get(feild_names)
defaults['ids'] = self.env.context('active_ids')
return defaults
context在客户端可以用来设置目标视图的默认值或激活默认筛选器,使用default_或者default_search_开头的关键字来完成这种设置。
{‘default_user_id’:uid}
{‘default_search_filter_res_users’:1}
[('is_done','=',False)] #[(<字段名>,<比较符>,<值>)]
使用时需注意:
只有一个记录的记录集成为单例,空记录也是单例。
对于单例模式,在开始时使用self.ensure_one()
from odoo import fields
fields.Datetime.now() ##时间
fields.Datetime.from_string('2018-01-01 00:00:00')
fields.Datet.today() ##日期
record是一个记录集,可以对其进行一下操作