OpenERP对象支持的字段类型有:
下面逐一说明:
boolean: 布尔型(true, false)
integer: 整数。
float: 浮点型,如
'rate' : fields.float('Relative Change rate',digits=(12,6)),digits定义整数部分和小数部分的位数。
char: 字符型,size属性定义字符串长度。
text: 文本型,没有长度限制。
date: 日期型
datetime: 日期时间型
binary: 二进制型
function: 函数型,该类型的字段,字段值由函数计算而得,不存储在数据表中。其定义格式为:
fields.function(fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type='float', fnct_search=None, obj=None, method=False, store=True)
· 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)
· 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)
def fcnt_search(self, cr, uid, obj, field_name, args)
def fcnt_search(cr, uid, obj, field_name, args)
store={'object_name':(function_name,['field_name1','field_name2'],priority)}
'state': fields.selection((('n','Unconfirmed'),('c','Confirmed')),'State', required=True)
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','category_id','Categories')
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")]
'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'。
'property_product_pricelist': fields.property('product.pricelist', type='many2one', relation='product.pricelist',string="Sale Pricelist", method=True, view_load=True, group_name="Pricelists Properties")
这个例子表示,本对象通过字段'property_product_pricelist'多对一(type='many2one')关联到对象product.pricelist(relation='product.pricelist')。和many2one字段类型不同的是,many2one字段会在本对象中创建数据表字段'property_product_pricelist',property字段类型不会创建数据表字段'property_product_pricelist'。property字段类型会从数据表ir.property中查找name='property_product_pricelist'(即字段定义中的'product.pricelist'加上前缀property,并将"."替换成"_"作为name)且company_id和本对象相同的记录,从该记录的value字段(value字段类型为reference)查得关联记录,如(product.pricelist,1),表示本对象的resource多对一关联到对象product.pricelist的id=1的记录。也就是说,property字段类型通过ir.property间接多对一关联到别的对象。
<record model="ir.property" id="property_product_pricelist"> <field name="name">property_product_pricelist</field> <field name="fields_id" search="[('model','=','res.partner'), ('name','=','property_product_pricelist')]"/> <field name="value" eval="'product.pricelist,'+str(list0)"/> </record>
字段定义中可用的参数有, change_default,readonly,required,states,string,translate,size,priority,domain,invisible,context,selection。
readonly: 本字段是否只读,缺省值:False。
required: 本字段是否必须的,缺省值:False。
'partner_id': fields.many2one('res.partner', 'Partner', states={'posted':[('readonly',True)]}),
string: 字段显示名,任意字符串。
translate: 本字段值(不是字段的显示名)是否可翻译,缺省值:False。
size: 字段长度。
priority:
'default_credit_account_id': fields.many2one('account.account', 'Default Credit Account', domain="[('type','!=','view')]"),
invisible: 本字段是否可见,即是否在界面上显示本字段,缺省值True。
另外一个问题就是function的store=true有没有意义呢,不是每次读取这个function就会执行里面的方法,那么还储存在数据库里面有什么作用?
我的理解是store=true可以将每次函数计算的结果存储到数据库中,这样有两个好处,一是便于DBA从数据库查看数据;二是非OpenERP的软件可以直接访问数据库共享数据。另外补充一点,fcnt_inv不限于写入本对象的数据表,更经常的情形是写入别的对象,甚至同时写入多个对象的数据表。
<field name="value" eval="'product.pricelist,'+str(list0)"/>
<record id="list0" model="product.pricelist"> <field name="name">Default Purchase Pricelist</field> <field name="type">purchase</field> </record>
基本方法:create, search, read, browse, write, unlink。
def create(self, cr, uid, vals, context={}) def search(self, cr, uid, args, offset=0, limit=2000) def read(self, cr, uid, ids, fields=None, context={}) def browse(self, cr, uid, select, offset=0, limit=2000) def write(self, cr, uid, ids, vals, context={}) def unlink(self, cr, uid, ids)
def default_get(self, cr, uid, fields, form=None, reference=None) def default_set(self, cr, uid, field, value, for_user=False)
def perm_read(self, cr, uid, ids) def perm_write(self, cr, uid, ids, fields)
def fields_get(self, cr, uid, fields = None, context={}) def fields_view_get(self, cr, uid, view_id=None, view_type='form',context={}) def distinct_field_get(self, cr, uid, field, value, args=[], offset=0,limit=2000)
def name_get(self, cr, uid, ids, context={}) def name_search(self, cr, uid, name='', args=[], operator='ilike',context={})
def name_get(self, cr, uid, ids, context={}) def name_search(self, cr, uid, name=, args=[], operator=’ilike’, context={})
def create(self, cr, uid, vals, context={})
id = pooler.get_pool(cr.dbname).get('res.partner.event').create(cr, uid,{'name': 'Email sent through mass mailing','partner_id': partner.id,'description': 'The Description for Partner Event'})
def search(self, cr, uid, args, offset=0, limit=2000)
def read(self, cr, uid, ids, fields=None, context={})
addr_obj = self.pool.get('res.partner.address').browse(cr, uid, contact_id) nom = addr_obj.name compte = addr_obj.partner_id.bank
def browse(self, cr, uid, select, offset=0, limit=2000)
def write(self, cr, uid, ids, vals, context={})
self.pool.get('sale.order').write(cr, uid, ids, {'state':'cancel'})
def unlink(self, cr, uid, ids)
def default_get(self, cr, uid, fields, form=None, reference=None)
self.pool.get('hr.analytic.timesheet').default_get(cr, uid, ['product_id','product_uom_id'])
def default_set(self, cr, uid, field, value, for_user=False)