API
而从13.0开始, 官方仅保留了5种装饰方法:
- model
- constrains
- depends
- onchange
- returns
model
作用:api.model装饰的方法, 其self只代表模型, 不含有具体的记录值.
典型应用是对象的create方法:
@api.model
def create(self,vals):
return super(HostelRoom,self).create(vals)
参数vals可以是一个字典, 也可以是一个字典组成的列表 . Odoo将会根据vals的类型返回单一或者多个记录集.
contrains
作用:给某些字段添加限制条件, 如果是多个字段, 用逗号将其分开. 触发条件: 单声明的字段值发生变化时触发
constrains只接受简单的字段名称, 像对象属性obj.x形式的参数将会被忽略. 另外, 使用constrains限制的字段必须出现在视图中(如果没有出现,可以使用重载create的方法强制实现).
在此模块中, 限制其名称长度必须在10个字符以内,否则提示错误.
@api.constrains("name")
def _check_name(self):
"""检查名称长度"""
if len(self.name) > 10:
raise ValidationError("名称必须限制在10个字符以内")
另外一种constrains
odoo支持另外一种添加限制的方式,即通过sql约束的方式。方法是在odoo类对象中添加_sql_constraints属性,值是一个包含了元组的列表,元组的三个值分别是约束名,约束条件和警告信息,看一个例子:
_sql_constraints = [
('name_description_check',
'CHECK(name != description)',
"The title of the course should not be the description"),
('name_unique',
'UNIQUE(name)',
"The course title must be unique"),
]
这样做的好处是,在数据库层面就限制了数据的校验,而不是在代码层面的校验,显然效率会更高。缺点是在添加限制之前,数据库中不能存在违反约束的数据,否则约束会添加失败。
depends
depends主要用于compute方法,对于任何fields都可以通过添加compute属性动态赋值。depends就是用来标该方法依赖于哪些字段的装饰。
@api.depends('date')
def _get_date_age(self):
self.age = (datetime.now().date() - self.date).days
depends装饰器的参数可以是多个以逗号分割的字段, 也可以是一个返回字段列表的函数. depends装饰器不可用于id字段.
对于compute方法来说,加不加depends装饰的区别在于,加了depends的方法会在依赖的字段发生改变时重新计算本字段的值,而不加depends的方法只在触发的第一次调用,也就是说不会持续更新。
returns
returns的用法主要是用来指定返回值的格式,它接受三个参数,第一个为返回值的model,第二个为向下兼容的method,第三个为向上兼容的method。
第一个参数如果是对象本身,则写'self',如果是其他对象,则写其他对象名如:@api.returns('ir.ui.view')。
例如:
@api.multi
@api.returns('mail.message', lambda value: value.id)
def message_post(self, **kwargs):
if self.env.context.get('mark_so_as_sent'):
self.filtered(lambda o: o.state == 'draft').with_context(tracking_disable=True).write({'state': 'sent'})
self.env.user.company_id.set_onboarding_step_done('sale_onboarding_sample_quotation_state')
return super(SaleOrder, self.with_context(mail_post_autofollow=True)).message_post(**kwargs)
returns主要用于确保新旧API返回值的一致,并不常用。
onchange
onchange的适用场景是当某个字段发生变化时被调用,用来处理需要动态联动的字段。
onchange的参数是发生变化的字段名,例如:
@api.onchange('people', 'prices')
def _onchange_price(self):
self.price = self.people* self.prices
return {
'warning': {
'title': "Something bad happened",
'message': "It was very bad indeed",
}
}
onchange 可以有返回值可以没有返回值。返回值由一个字典组成,可选的值有 value和warning,value用来返回需要设置的字段值,warning用来返回一些警告信息。
@api.onchange('field_name')
def onchange_field_name(self):
value = self.field_name if self.field_name else 'Nothing'
return {'value': {'field_name': value}}