OpenERP 对象支持的字段类型有,基础类型:char, text, boolean, integer, float, date, time, datetime, binary;复杂类型:selection, function, related;关系类型:one2one, one2many, many2one, many2many。下面逐一说明。
fields.function(fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type='float', fnct_search=None, obj=None, method=False, store=True)
type 是函数返回值的类型。
method 为 True 表示本字段的函数是对象的一个方法,为 False 表示是全局函数,不是对象的方法。 如果 method=True,obj 指定 method 的对象。
fcnt 是函数或方法,用于计算字段值。
#如果 method = true, 表示 fcnt 是对象的方法,其格式如下:
def fnct(self, cr, uid, ids, field_name, args, context)
#否则,其格式如下:
def fnct(cr, table, ids, field_name, args, context)
#ids 是系统传进来的当前存取的 record id。field_name是本字段名,当一 个函数用于多个函数字段类型时,本参数可区分字段。args 是'arg=None'传进来的参数。
fcnt_inv 是用于写本字段的函数或方法。
#如果 method = true, 其格式是:
def fcnt_inv(self, cr, uid,ids, field_name, field_value, args, context)
#否则格式为:
def fcnt_inv(cr, table, ids, field_name, field_value, args, context)
fcnt_search 定义该字段的搜索行为。
# 如果 method = true, 其格式为:
def fcnt_search(self, cr, uid,obj, field_name, args)
# 否则格式为:
def fcnt_search(cr, uid, obj, field_name, args)
store 表示是否希望在数据库中存储本字段值,缺省值为 False。不过 store 还有一个增强形式,格 式为 store={'object_name':(function_name,['field_name1','field_name2'],priority)} ,其含义是,如果 对象'object_name'的字段['field_name1','field_name2']发生任何改变,系统将调用函数 function_name,函数的返回结果将作为参数(arg)传送给本字段的主函数,即 fnct。
selection: 下拉框字段。定义一个下拉框,允许用户选择值。如:'state': fields.selection((('n','Unconfirmed'),('c','Confirmed')),'State', required=True),这表示 state 字段有两个 选项('n','Unconfirmed')和('c','Confirmed')。
one2one: 一对一关系,格式为:fields.one2one(关联对象 Name, 字段显示名, ... )。在 V5.0 以后的 版本中不建议使用,而是用 many2one 替代。
many2one: 多对一关系,格式为:fields.many2one(关联对象 Name, 字段显示名, ... )。可选参数有: ondelete,可选值为"cascade"和"null",缺省值为"null",表示 one 端的 record 被删除后,many 端 的 record 是否级联删除。
one2many: 一对多关系,格式为:fields.one2many(关联对象 Name, 关联字段, 字段显示名, ... ),例: 'address': fields.one2many('res.partner.address', 'partner_id', 'Contacts')。
many2many: 多对多关系。例如:
'category_id':fields.many2many('res.partner.category','res_partner_category_rel','partner_id','cate
gory_id','Categories')
表示以多对多关系关联到对象 res.partner.category,关联表为'res_partner_category_rel',关联字段 为 'partner_id'和'category_id'。当定义上述字段时,OpenERP 会自动创建关联表为 'res_partner_category_rel',它含有关联字段'partner_id'和'category_id'。
reference: 引用型,格式为:fields.reference(字段名, selection, size, ... )。 其中 selection 是:
def _links_get(self, cr, uid):
cr.execute('select object,name from res_request_link order by priority')
return cr.fetchall()
...
'ref':fields.reference('Document Ref 2', selection=_links_get, size=128), ...
上例表示,字段 ref 可以引用哪些对象类型的 resource,可引用的对象类型从下拉框选择。下拉框的 选项由函数_links_get 返回,是 (object,name)对的列表,如[("product.product","Product"), ("account.invoice","Invoice"), ("stock.production.lot","Production Lot")] 。related: 关联字段,表示本字段引用关联表中的某字段。格式为:fields.related(关系字段,引用字 段,type, relation, string, ...),关系字段是本对象的某字段(通常是 one2many or many2many),引 用字段是通过关系字段关联的数据表的字段,type 是引用字段的类型,如果 type 是 many2one or many2many, relation 指明关联表。例子如下:
'address': fields.one2many('res.partner.address', 'partner_id', 'Contacts'), 'city':fields.related('address','city',type='char', string='City'), 'country':fields.related('address','country_id',type='many2one', relation='res.country',
string='Country'),
这 里,city 引用 address 的 city 字段,country 引用 address 的 country 对象。在 address 的关联对象 res.partner.address 中,country_id 是 many2one 类型的字段,所以 type='many2one', relation='res.country'。