Xodoo 第八节

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}}

猜你喜欢

转载自blog.csdn.net/qq_70140795/article/details/139779314