字段描述符包含了字段的定义,下面是实例化一个字段时的属性:
class Field(object):
:param string: 字段标签(用户所见),如果不设置ORM将取用类的字段名(大写)。
:param help: 用户所见的工具提示(string)
:param readonly: 是否只读(boolean,默认为False)
:param required: 是否为必须字段(boolean, 默认为False)
:param index: 字段是否在数据库中索引(boolean, 默认为False)
:param default: 字段的默认值; 要么为一个静态值,要么接受一个记录集,返回一个值。
:param states: 一个字典,state值映射到一个列表(UI 属性值对)。这些属性为'readonly', 'required', 'invisible'.
注意: 任意基于state的字段要求state字段的值在客户端UI上是可用的。
:param groups: 逗号分割的列表,(group xml ids)这仅限于对给定组的用户访问。
:param bool copy: 当记录(duplicated)复制的时候,字段值是否被拷贝(copied)
(默认: 常规字段为True, one2many和computed字段为False,包括property字段和related字段)
:param string oldname: 这个字段之前的名字, 以便ORM在migration是自动重新命名它。
Computed fields
计算字段其值是被计算的,而不是简单地从数据库进行读取。下面给出计算字段特有的属性,定义
这样一个字段,简单为compute属性提供一个值。
:param compute: 计算这个字段的方法名
:param inverse: 反转这个字段的方法名 (可选的)
:param search: 实现在这个字段上搜索的方法名(可选的)
:param store: 这个字段是否存储在数据库中 (boolean, 在计算字段上默认为False)
:param compute_sudo: 是否以超级管理员来计算字段,来绕过访问权限。(boolean, 默认为False)
例如:
upper = fields.Char(compute='_compute_upper',
inverse='_inverse_upper',
search='_search_upper')
@api.depends('name')
def _compute_upper(self):
for rec in self:
rec.upper = rec.name.upper() if rec.name else False
def _inverse_upper(self):
for rec in self:
rec.name = rec.upper.lower() if rec.upper else False
def _search_upper(self, operator, value):
if operator == 'like':
operator = 'ilike'
return [('name', operator, value)]
这个计算方法必须为被调用记录集合中的所有记录进行指定这个字段(为每个记录这个字段派遣一个字段值,通过计算得到)。
计算方法必须应用一个装饰器:meth:`openerp.api.depends` 来指定字段的依赖用于计算; 这些依赖用于决定什么时候重新计算这个字段。
重新计算是自动的保证缓存和数据库的一致性。
注意:同一方法可用于多个字段,你仅仅须要在这个方法中对所有给定的字段进行派遣。对于所有字段,这个方法将会触发一次。
默认情况下,计算字段不存储在数据库中,进行即时运算。设置,store=True会将字段值存储在数据库中,
存储字段的优点是在该字段上的搜索由数据库本身完成,缺点是当这个字段被重新计算的时候,它需要数据库更新。
反转方法,计算方法的逆运算: 你必须在字段的依赖上做些必要的变化,以能够使得计算结构符合期望的值。
注意:没有逆运算方法的计算字段默认情况下为只读的。
在做模型上做一个实际的搜索之前处理域时,这个搜索方法被触发。它必须返回一个域(等价于这样条件:【field operator value】)
Related fields
Related字段的值由关系字段序列给出,在reached model(可到达的模型上)上读取一个字段。
要遍历的字段序列通过这个属性指定。
:param related: 字段名序列
如果字段属性没有被重新定义,这些字段的属性被自动从源字段进行拷贝。( string, help, readonly, required(所有的字段为required=True,这个related字段被设置成required=True)
), groups,digits,size,translate,sanitize,selection,comodel_name,domain,context。
所有的semantic-free属性将从源字段被拷贝过来。
默认情况下,related字段的值不会存储在数据库中。添加store=True属性则进行存储,就像computed字段。
当他们的依赖被修改的时候Related字段将会自动重新计算。
Company-dependent fields
以前的property字段, 这些字段的值取决于公司。换句话说,属于不同公司的用户对于给定的一条记录将会看到不同的值。
:param company_dependent: 该字段是否company-dependent(boolean)
Incremental definition(增量定义)
一个字段定义为模型类的类属性。如果这个模型是可继承的,那么通过在子类上重新定义同一类型且同一字段名的字段来扩展模型字段。
从父类中获取的字段属性将会被子类中给定的字段属性给覆盖。
例如:下面第二个类只在state字段添加了一个工具提示:
class First(models.Model):
_name = 'foo'
state = fields.Selection([...], required=True)
class Second(models.Model):
_inherit = 'foo'
state = fields.Selection(help="Blah blah blah")