Odoo 欄位基本屬性
技術標籤:odooodoo教程pythonpostgresqljavascriptlinux其他
點選跳轉進入免費課程(課程持續更新中…)
課件文件地址:點選跳轉
課程環境地址:點選跳轉 賬密:testuser
gitee程式碼地址:點選跳轉(分支learning_odoo12)
微信公眾號二維碼:
Basic fields
odoo定義欄位的幾種型別:
class odoo.fields.Char() 定義str型別的欄位 class odoo.fields.Boolean() 定義布林型別的欄位 class odoo.fields.Integer() 定義數值型別的欄位 class odoo.fields.Float() 定義浮點型別欄位 class odoo.fields.Text() 定義str型別的欄位 (長文字) class odoo.fields.Selection() 定義列舉型別欄位 class odoo.fields.Html() 用於儲存HTML class odoo.fields.Date() 日期 class odoo.fields.Datetime() 日期時間 class odoo.fields.Many2one() class odoo.fields.One2many() class odoo.fields.Many2many() class odoo.fields.Reference()
class odoo.fields.Field(string=, **kwargs)
欄位描述符同事包含欄位定義,並對記錄上相應欄位的訪問和分配。 例項化欄位時,可以設定以下屬性:
Parameters string – 欄位的顯示名稱; 如果沒設定,自動用欄位的大寫 help – 使用者可見的欄位提示內容 readonly – 欄位是否只讀,boolean型別 預設為false required – 欄位是否必填 (boolean, by default False) index – 欄位是否在資料庫中建立索引,對於非儲存欄位沒有影響 (boolean, by default False) default – 欄位預設值,可以是一個字串, 也可以是一個返回正確記錄集或值得方法 states – 值是一個欄位,使用其控制UI的顯示。使用屬性一般為‘readonly’, ‘required’, ‘invisible’ 。注意,states的鍵必須是 state已經設定的可以狀態 例如:name = fields.Char(readonly=False, states={'done': [('readonly', True)]}),done為state欄位的一個列舉選項 groups – 使用者組許可權xmlid列表,用逗號分隔,擁有該許可權的使用者可見。例如:signup_token = fields.Char(copy=False, groups="base.group_erp_manager") copy (bool) – 複製當前記錄時,當前欄位值是否可複製 (default: True ) oldname (str) – 此欄位的先前名稱,ORM可以在遷移時自動重新命名 group_operator (str) – read_group() 在該欄位上分組時使用的聚合函式。 支援的聚合函式是: array_agg : values, including nulls, concatenated into an array count : number of rows count_distinct : number of distinct rows bool_and : true if all values are true, otherwise false bool_or : true if at least one value is true, otherwise false max : maximum value of all values min : minimum value of all values avg : the average (arithmetic mean) of all values sum : sum of all values
計算欄位 Computed fields
計算欄位是指 一個欄位的值,可以通過一個函式來動態計算出來
通過compute 屬性可以實現這樣的定義
Parameters compute – 定的方法名稱(string) inverse – 反引數 search – 欄位上實現搜尋的方法的名稱 store – 欄位是否儲存到資料庫 (boolean, by default False on computed fields) compute_sudo – 改善欄位是否使用超級使用者計算,從而繞過訪問許可權,(boolean, by default False) 該屬性對於不存資料庫的欄位沒有影響
compute, inverse and search的使用格式如下:
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)]
預設情況不帶inverse引數下計算欄位是隻讀的,如果需要在計算欄位上進行手動輸入,可以通過給出反函式來完成。因此,當欄位被寫入/建立時,它會觸發對修飾函式的呼叫。它反轉計算並設定相關欄位。Invserse 通俗得講,其compute的相反設定,通過設定 inverse,來達到為該欄位賦值的目的。設定了 inverse 這個,欄位就可以在前端直接編輯,賦值就是通過這個 inverse 設定的方法。
預設情況下,計算欄位不會儲存到資料庫中,而是即時計算。可以通過設定屬性store=True將欄位儲存到資料庫中。儲存欄位的優點是,該欄位的搜尋由資料庫本身完成。缺點是,欄位重新計算時,需要資料庫更新。
因此,不能正常搜尋未儲存在資料庫中的計算欄位,需要使用search,必須顯式定義搜尋函式。在對模型進行實際搜尋之前,在處理域時會調用搜索方法。 它必須返回一個等效於以下條件的域:欄位運算子值
關係欄位 Related fields
關係欄位通過related屬性來設定,其值為模型外來鍵關聯的欄位。關係欄位預設也不儲存資料庫。
使用格式:
user_id = fields.many2one('res.users')
email = field.char(related='user_id.email')
預設情況下,相關欄位的值不儲存到資料庫中。新增屬性store=True以使其儲存,就像計算欄位一樣。修改相關性後,會自動重新計算相關欄位。
模型繼承時欄位的增量處理 Incremental definition
欄位定義做為模型類的一個屬性。如果對模型進行擴充套件,在子類中可以看到並使用父類所定義的屬性。如果子類定義欄位名稱相同則替換父類中的欄位
欄位被定義為模型類的類屬性。如果擴充套件了模型(請參閱參考資料Model),可以通過在子類上重新定義具有相同名稱和相同型別的欄位來擴充套件欄位定義。在這種情況下,欄位的屬性取自父類,並被子類中給定的屬性覆蓋。
例如:
class First(models.Model):
_name = 'foo'
state = fields.Selection([...], required=True)
class Second(models.Model):
_inherit = 'foo'
state = fields.Selection(help="Blah blah blah")
時間日期型別欄位
日期是常用而且重要的欄位,
日期欄位(fields.Date)儲存在資料庫中的字串格式為 年-月-日(YYYY-MM-DD)
日期時間欄位(fields.Datetime)儲存在資料庫中的字串格式為 年-月-日 時:分:秒(YYYY-MM-DD HH:MM:SS)
日期型別欄位的常見操作,
在賦值時如果不確定得到的資料是 日期型別還是日期時間型別,可以使用 to_date() or to_datetime() 進行處理
例如:
fields.Date.to_date(self._context.get('date_from'))
Date和Datetime的一些其他操作可以通過封裝好的工具odoo.tools.date_utils來實現
class odoo.fields.Date(string=, kwargs) 型別下欄位的一些處理方法
- static add(*args, **kwargs)
- static context_today(timestamp=None)
- static end_of(granularity)
- static start_of(granularity)
- static subtract(*args, **kwargs)
- static to_date()
- static to_string()
- static today()
**class odoo.fields.Datetime(string=, kwargs) 型別下欄位的一些處理方法
- static add(*args, **kwargs)
- static context_timestamp(timestamp)
- static end_of(granularity)
- static now()
- static start_of(granularity)
- static subtract(*args, **kwargs)
- static to_datetime()
- static to_string()
- static today()
Relational fields
class odoo.fields.Many2one(comodel_name=<object object>, string=<object object>, **kwargs)
值可以為空或者是單個記錄集(資料庫儲存的是記錄集的id(type int))
Parameters
comodel_name – 目標模型的名稱 (string)
domain – 目標模型的篩選條件域
context – 處理該欄位時在客戶端使用的可選上下文(dictionary)
ondelete – 刪除引用記錄時的操作;可能的值是:'set null','restrict','cascade'
auto_join – 搜尋該欄位時是否生成JOIN(預設為boolean False)
delegate – set it to True to make fields of the target model accessible from the current model (corresponds to _inherits)
其中comodel_name引數是必填,其他引數可選
使用格式如下:
class A(models.Model):
_name='a.table'
b_id = fields.Many2one('b.table')
class B(models.Model):
_name='b.table'
class odoo.fields.One2many(comodel_name=<object object>, inverse_name=<object object>, string=<object object>, **kwargs)
一對多,comodel_name,inverse_name引數為必填項,其他引數可選
Parameters
comodel_name – 目標模型名稱 (string)
inverse_name – comodel_name 目標模型對應Many2one欄位名稱(string)
domain –目標模型的篩選條件域 (domain or string)
context – 處理該欄位時在客戶端使用的可選上下文(dictionary)
auto_join – whether JOINs are generated upon search through that field (boolean, by default False)
limit – 讀取時,可選最大顯示數量 (integer)
使用格式如下:
class A(models.Model):
_name='a.table'
b_id = fields.One2many('b.table', 'a_id')
class B(models.Model):
_name='b.table'
a_id = field.Many2one('a.table')
class odoo.fields.Many2many(comodel_name=<object object>, relation=<object object>, column1=<object object>, column2=<object object>, string=, **kwargs)
多對多,comodel_name引數必填,其他引數可選,relation,column1,column2如果未設定odoo會自動命名
Parameters
comodel_name –目標模型的名稱(字串)
relation – 目標模型和當前模型的關聯表 (string)
column1 – 關聯表中當前模型的記錄欄位名 (string)
column2 – 關聯表中目標模型的記錄欄位名稱 (string)
domain – 目標模型的篩選條件域 (domain or string)
context – 處理該欄位時在客戶端使用的可選上下文(dictionary)
limit – 讀取時,可選最大顯示數量(integer)
使用格式如下:
class A(models.Model):
_name='a.table'
b_ids = fields.Many2many('b.table', relation='a_b_table_rel', column1='a_table_id', column2='b_table_id')
class B(models.Model):
_name='b.table'