Odoo12入門(5)-特殊字段

計算字段和默認值

  我們的大部分字段都是直接在數據庫中存儲和檢索的。其實字段的值也可以通過調用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的使用情況
  1. 數據庫遊標獲取 self.env.cr 或者 self._cr
  2. 當前登錄數據庫的用戶ID self.env.uid 或者 self._uid
  3. 當前登錄用戶的記錄對象 self.env.user
  4. 上下文值字典 self.env.context 或者 self._context
  5. self.env.ref(xml_id) 返回對應的xml對象的ID - 視圖return用的比較多
  6. self.env[model_name]返回一個模型的實例 不是記錄實例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章