OpenERP對象支持的字段類型有,基礎類型:char, text, boolean, integer, float, date, time, datetime, binary;復雜類型:selection, function, related;關系類型:one2one, one2many, many2one, many2many。下面逐一說明。
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)
· 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: 多對多關系。例如:
表示以多對多關系關聯到對象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是: 1)返回tuple列表的函數,或者 2)表征該字段引用哪個對象(or model)的tuples列表。reference字段在數據庫表中的存儲形式是(對象名,ID),如(product.product,3)表示引用對象product.product(數據表product_product)中id=3的數據。reference的例子:
上例表示,字段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指明關聯表。例子如下:
這裡,city引用address的city字段,country引用address的country對象。在address的關聯對象res.partner.address中,country_id是many2one類型的字段,所以type='many2one', relation='res.country'。
property: 屬性字段,下面以具體例子解說property字段類型。
'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間接多對一關聯到別的對象。
字段定義的參數
change_default:別的字段的缺省值是否可依賴於本字段,缺省值為:False。例子(參見res.partner.address),
這個例子中,可以根據zip的值設定其它字段的缺省值,例如,可以通過程序代碼,如果zip為200000則city設為“上海”,如果zip為100000則city為“北京”。
readonly: 本字段是否只讀,缺省值:False。
required: 本字段是否必須的,缺省值:False。
states: 定義特定state才生效的屬性,格式為:{'name_of_the_state': list_of_attributes},其中list_of_attributes是形如[('name_of_attribute', value), ...]的tuples列表。例子(參見account.transfer):
string: 字段顯示名,任意字符串。
translate: 本字段值(不是字段的顯示名)是否可翻譯,缺省值:False。
size: 字段長度。
priority:
domain: 域條件,缺省值:[]。在many2many和many2one類型中,字段值是關聯表的id,域條件用於過濾關聯表的record。例子:
'default_credit_account_id': fields.many2one('account.account', 'Default Credit Account', domain="[('type','!=','view')]"),
本例表示,本字段關聯到對象('account.account')中的,type不是'view'的record。
invisible: 本字段是否可見,即是否在界面上顯示本字段,缺省值True。
selection: 只用於reference字段類型,參見前文reference的說明。
> 另外一個問題就是function的store=true有沒有意義呢,不是每次讀取這個function就會執行裡面的方法,那麼還儲存在數據庫裡面有什麼作用?
我的理解是store=true可以將每次函數計算的結果存儲到數據庫中,這樣有兩個好處,一是便於DBA從數據庫查看數據;二是非OpenERP的軟件可以直接訪問數據庫共享數據。另外補充一點,fcnt_inv不限於寫入本對象的數據表,更經常的情形是寫入別的對象,甚至同時寫入多個對象的數據表。
> <field name="value" eval="'product.pricelist,'+str(list0)"/>
前文說過,value字段類型為reference,即形如(product.pricelist,1)的值。這一行就是計算value的值,形如(product.pricelist,list0),list0(經導入後其值是數字)是引用的product.pricelist中的一條記錄的id,如下。
也就是說,在<field name="value" eval="'product.pricelist,'+str(list0)"/>之前,必須先有上述導入id="list0"的代碼行。
基本方法:create, search, read, browse, write, unlink。
缺省值存取方法:default_get, default_set。
def default_get(self, cr, uid, fields, form=None, reference=None)
def default_set(self, cr, uid, field, value, for_user=False)
特殊字段操作方法:perm_read, perm_write
def perm_read(self, cr, uid, ids)
def perm_write(self, cr, uid, ids, fields)
字段(fields)和視圖(views)操作方法:fields_get, distinct_field_get, fields_view_get
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)
記錄名字存取方法:name_get, name_search
def name_get(self, cr, uid, ids, context={})
def name_search(self, cr, uid, name='', args=[], operator='ilike',context={})
缺省值存取方法:default_get, default_set
def name_get(self, cr, uid, ids, context={})
def name_search(self, cr, uid, name=, args=[], operator=’ilike’, context={})
create方法:在數據表中插入一條記錄(或曰新建一個對象的resource)。
格式:def create(self, cr, uid, vals, context={})
參數說明:
vals: 待新建記錄的字段值,是一個字典,形如: {'name_of_the_field':value, ...}
context (optional): OpenERP幾乎所有的方法都帶有參數context,context是一個字典,存放一些上下文值,例如當前用戶的信息,包括語言、角色等。context可以塞入任何值,在action定義中,有一個context屬性,在界面定義時,可以在該屬性中放入任何值,context的最初值通常來自該屬性值。
返回值:新建記錄的id。
舉例: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'})
search方法:查詢符合條件的記錄。
格式:def search(self, cr, uid, args, offset=0, limit=2000)
參數說明:
args: 包含檢索條件的tuples列表,格式為: [('name_of_the_field', 'operator', value), ...]。可用的operators有:
更詳細說明,參考《OpenERP應用和開發基礎》中的“域條件”有關章節。
· offset (optional): 偏移記錄數,表示不返回檢索結果的前offset條。
· limit (optional): 返回結果的最大記錄數。
返回值:符合條件的記錄的id list。
read方法:返回記錄的指定字段值列表。
格式:def read(self, cr, uid, ids, fields=None, context={})
參數說明:
· ids: 待讀取的記錄的id列表,形如[1,3,5,...]
· fields (optionnal): 待讀取的字段值,不指定的話,讀取所有字段。
· context (optional): 參見create方法。
返回值:返回讀取結果的字典列表,形如 [{'name_of_the_field': value, ...}, ...]
browse方法:浏覽對象及其關聯對象。從數據庫中讀取指定的記錄,並生成對象返回。和read等方法不同,本方法不是返回簡單的記錄,而是返回對象。返回的對象可以直接使用"."存取對象的字段和方法,形如"object.name_of_the_field",關聯字段(many2one等),也可以通過關聯字段直接訪問“相鄰”對象。例如:
這段代碼先從對象池中取得對象res.partner.address,調用它的方法browse,取得id=contact_id的對象,然後直接用"."取得"name"字段以及關聯對象patner的銀行(addr_obj.partner_id.bank)。
格式:def browse(self, cr, uid, select, offset=0, limit=2000)
參數說明:
select: 待返回的對象id,可以是一個id,也可以是一個id 列表。
· offset (optional): 參見search方法。
· limit (optional): 參見search方法。
返回值:返回對象或對象列表。
注意:本方法只能在Server上使用,由於效率等原因,不支持rpc等遠程調用。
write方法:保存一個或幾個記錄的一個或幾個字段。
格式:def write(self, cr, uid, ids, vals, context={})
參數說明:
· ids: 待修改的記錄的id列表。
· vals: 待保存的字段新值,是一個字典,形如: {'name_of_the_field': value, ...}。
· context (optional): 參見create方法。
返回值:如果沒有異常,返回True,否則拋出異常。
舉例:self.pool.get('sale.order').write(cr, uid, ids, {'state':'cancel'})
unlink方法:刪除一個或幾個記錄。
格式:def unlink(self, cr, uid, ids)
參數說明:
· ids: 待刪除的記錄的id列表。
返回值:如果沒有異常,返回True,否則拋出異常。
default_get方法:復位一個或多個字段的缺省值。
格式: def default_get(self, cr, uid, fields, form=None, reference=None)
參數說明:
• fields: 希望復位缺省值的字段列表。
• form (optional): 目前似乎未用(5.06版)。
• reference (optional): 目前似乎未用(5.06版)。
返回值: 字段缺省值,是一個字典,形如: {'field_name': value, ... }。
舉例:self.pool.get('hr.analytic.timesheet').default_get(cr, uid, ['product_id','product_uom_id'])
default_set方法:重置字段的缺省值。
格式: def default_set(self, cr, uid, field, value, for_user=False)
參數說明:
• field: 待修改缺省值的字段。
• value: 新的缺省值。
• for_user (optional): 修改是否只對當前用戶有效,還是對所有用戶有效,缺省值是對所有用戶有效。
返回值: True
*