在認識odoo ORM框架前,先介紹一下odoo中模塊目錄結構。php
data
:存放模塊預製數據
i18n
:存放國際化文件
models
:存放模型等py代碼
security
:存放權限文件
views
:存放視圖文件
__manifest__.py
:該文件用於聲明該模塊,並指定一些模塊元數據。(odoo8時該文件爲__openerp__.py
。)python
# -*- coding: utf-8 -*- { # name:模塊名稱 'name': " test", # description:模塊描述 'description': """ 自定義模塊 """, # author:模塊做者(XXX公司或張三) 'author': "Hu", # website:做者或公司網址 'website': "http://weibo.com/hcw1202", # category:模塊分類 'category': "test", # version:模塊版本 'version': "版本", # depends:所依賴其餘模塊 'depends': ["base","stock","sale"], # 模塊安裝時加載 'data': [ 'security/權限文件.csv', 'data/預製數據.xml', 'views/視圖文件.xml', ], # 建立數據庫時勾選Load demonstration data後安裝該模塊加載演示數據 'demo': [ 'data/演示數據.xml', ], }
在/models下添加test.py
文件git
# -*- coding: utf-8 -*- from odoo import models, api, fields, _ class Test(models.Model): # 模型惟一標識(對應數據表爲product_manage_product) _name = 'product_manage.product' # 數據顯示名稱,如設置則返回其指定的字段值 _rec_name = 'test_field' # 字段 test_field = fields.Char(string="字段名稱")
model屬性詳解:
_name
:模型惟一標識,類非繼承父類時必須指定。
_rec_name
:數據顯示名稱,如設置則返回其指定的字段值,不設置默認顯示字段爲name的字段值,如無name字段則顯示"模塊名,id";詳見BaseModel.name_get
方法。
_log_access
:是否自動增長日誌字段(create_uid
, create_date
,write_uid
, write_date
)。默認爲True。
_auto
:是否建立數據庫對象。默認爲True,詳見BaseModel._auto_init方法。
_table
:數據庫對象名稱。缺省時數據庫對象名稱與_name指定值相同(.
替換爲下劃線)。
_sequence
:數據庫id字段的序列。默認自動建立序列。
_order
:數據顯示排序。所指定值爲模型字段,按指定字段和方式排序結果集。web
例:_order = "create_date desc":根據建立時間降序排列。可指定多個字段。sql
不指定desc默認升序排列;不指定_order默認id升序排列。數據庫
_constraints
:自定義約束條件。模型建立/編輯數據時觸發,約束未經過彈出錯誤提示,拒絕建立/編輯。api
格式:_constraints = [(method, 'error message', [field1, ...]), ...]
method
:檢查方法。返回True|Falseerror message
:不符合檢查條件時(method返回False)彈出的錯誤信息[field1, ...]
:字段名列表,這些字段的值會出如今error message中。框架
_sql_constraints
:數據庫約束。dom
例:_sql_constraints = [ ('number_uniq', 'unique(number, code)', 'error message') ]
會在數據庫添加約束:CONSTRAINT number_uniq UNIQUE(number, code)
函數
_inherit
:單一繼承。值爲所繼承父類_name標識。如子類不定義_name屬性,則在父類中增長該子類下的字段或方法,不建立新對象;如子類定義_name屬性,則建立新對象,新對象擁有父類全部的字段或方法,父類不受影響。
格式:_inherit = '父類 _name'
_inherits
:多重繼承。子類經過關聯字段與父類關聯,子類不擁有父類的字段或方法,可是能夠直接操做父類的字段或方法。
格式:_inherits = {'父類 _name': '關聯字段'}
Char
:字符型,使用size參數定義字符串長度。
Text
:文本型,無長度限制。
Boolean
:布爾型(True,False)
Interger
:整型
Float
:浮點型,使用digits參數定義整數部分和小數部分位數。如digits=(10,6)
Datetime
:日期時間型
Date
:日期型
Binary
:二進制型
selection
:下拉框字段。
例:state = fields.Selection([('draft', 'Draft'),('confirm', 'Confirmed'),('cancel', 'Cancelled')], string='Status')
Html
:可設置字體格式、樣式,可添加圖片、連接等內容。效果以下:
One2many
:一對多關係。
定義:otm = fields.One2many("關聯對象 _name", "關聯字段",string="字段顯示名",...
)
例:analytic_line_ids = fields.One2many('account.analytic.line', 'move_id', string='Analytic lines')"
Many2one
定義:mto = fields.Many2one("關聯對象 _name", string="字段顯示名",...
)
可選參數:ondelete,可選值爲‘cascade’和‘null’,缺省爲null。表示one端刪除時many端是否級聯刪除。
Many2many
定義:mtm = fields.Many2many("關聯對象 _name", "關聯表/中間表","關聯字段1","關聯字段2",string="字段顯示名"
,...)
其中,關聯字段、關聯表/中間表可不填,中間表缺省爲:表1_表2_rel
例:
partner_id= fields.Many2many("res.partner", string="字段顯示名",...)
"
readonly
:是否只讀,缺省值False。
required
:是否必填,缺省值Falsse。
string
:字段顯示名,任意字符串。
default
:字段默認值
domain
:域條件,缺省值[]。在關係型字段中,domain用於過濾關聯表中數據。
help
:字段描述,鼠標滑過期提示。
store
:是否存儲於數據庫。結合compute和related使用。
例:sale_order = fields.One2many("sale.order", "contract_id",string="銷售訂單", domain=[('state','=','sale')])
compute
:字段值由函數計算,該字段可不儲存於數據庫。
例:amount = fields.Float(string="金額總計", compute=‘_compute_amount’,store=True)
_compute_amount
爲計算函數。
related
:字段值引用關聯表中某字段。
如下代碼表示:company_id
引用hr.payroll.advice
中company_id
advice_id = fields.Many2one('hr.payroll.advice', string='Bank Advice') company_id = fields.Many2one('res.company', related='advice_id.company_id', string='Company',