Odoo-----计算字段、depnds,onchange 机制、模型约束

1 计算字段和默认值问题

​ 字段通过调用模型的方法的实时计算获得,一般都是 compute 属性为主的方法,这个计算方法通过计算self每条记录设置的的值,self 是一个有记录的有序集合,支持python集合操作len(self),iter(self),迭代过程逐个提交self记录,每个记录都是记录本身都是大小为1集合,可以通过点号进行访问;

​ 1.1 通过依赖值 通过deponds(' ')

from odoo import models, fields, api

class ComputedModel(models.Model):
    _name = 'test.computed'

   name = fields.Char(compute='_compute_name')
   value = fields.Integer()

   @api.depends('value')
   def _compute_name(self):        
        for record in self:
           record.name = "Record with value %s" % record.value

1.2 默认值 给任何字段给出默认值,default=x

​ default= lambda self: self.env.user

self.env 对象给出访问的参数和其他有用的信息 
self.env.cr  数据库游标对象,通过用于查询数据库
self.env.uid 是当前用户的数据库的id
self.env.user 是当前用户记录
self.env.ref(xml_id)返回xml_id对应的记录
self .env[model_name]返回给定模型的实例
name = fields.Char(default="Unknown")
user_id = fields.Many2one('res.users', default=lambda self: self.env.user)

1.2 onchange机制

​ 不需要数据库保存任何内容,就可以更新新表单使用onchange()

# onchange handler
@api.onchange('amount', 'unit_price')
def _onchange_price(self):
    # set auto-changing field
    self.price = self.amount * self.unit_price
    # Can optionally return a warning and domains
    return {
        'warning': {
            'title': "Something bad happened",
            'message': "It was very bad indeed",
        }
    

1.3 模型约束

constrains('model_name')

from odoo.exceptions import ValidationError

@api.constrains('age')
def _check_something(self):
    for record in self:
        if record.age > 20:
            raise ValidationError("Your record is too old: %s" % record.age)
    # all records passed the test, don't return anything

posted @ 2022-10-25 23:34  dayu2020  阅读(154)  评论(0编辑  收藏  举报