計算字段和默認值
我們的大部分字段都是直接在數據庫中存儲和檢索的。其實字段的值也可以通過調用model中的一個方法實時計算。
爲了創建計算字段,我們需要創建一個字段並且給它的屬性compute指定一個方法,這個計算方法能夠對每一條記錄直接計算設置值。
計算方法接收的self一般都是記錄集,是多條數據的一個集合,而計算方法實際是對每一條記錄的對應字段賦值,所以我們一般需要對方法使用@api.multi裝飾並且通過for rec in self來循環處理。
import random
from odoo import models, fields, api
class ComputedModel(models.Model):
_name = 'test.computed'
name = fields.Char(compute='_compute_name')
@api.multi
def _compute_name(self):
for record in self:
record.name = str(random.randint(1, 1e6))
依賴
計算字段的值經常需要依賴其他字段的值,我們通過使用@api.depends(‘fields1’,‘fields2’)來裝飾計算方法。當依賴的字段被改變的時候,計算字段會被重新計算。
from odoo import models, fields, api
class ComputedModel(models.Model):
_name = 'test.computed'
name = fields.Char(compute='_compute_name')
value = fields.Integer()
@api.depends('value')
def _compute_name(self):
for record in self:
record.name = "Record with value %s" % record.value
默認值
每一個字段都可以擁有一個默認值,在字段定義的時候添加一個default=X的屬性即可,X可以是一個python的可迭代值或者一個擁有返回記錄集的方法。
name = fields.Char(default="Unknown")
user_id = fields.Many2one('res.users', default=lambda self: self.env.user)
self.env的使用情況
- 數據庫遊標獲取 self.env.cr 或者 self._cr
- 當前登錄數據庫的用戶ID self.env.uid 或者 self._uid
- 當前登錄用戶的記錄對象 self.env.user
- 上下文值字典 self.env.context 或者 self._context
- self.env.ref(xml_id) 返回對應的xml對象的ID - 視圖return用的比較多
- self.env[model_name]返回一個模型的實例 不是記錄實例