案例0001
sale_obj=self.env['sale.order'].browse(k)
通過browse查找對象
找到對象里面的 sale_obj.name
browse
獲取一個數據庫id或一個ids列表,並返回一個記錄集,當從Odoo外部獲得記錄id時(例如通過外部系統的往返)或在舊API中調用方法時,會很有用:
>>> self.browse([7, 18, 12]) res.partner(7, 18, 12)
exists()
返回一個新的記錄集,其中只包含數據庫中存在的記錄。可以用來檢查記錄(如從外部獲得的)是否仍然存在:
if not record.exists(): raise Exception("The record has been deleted")
或者在調用了一個可以刪除一些記錄的方法之后:
records.may_remove_some()
# only keep records which were not deleted records = records.exists()
ref()
環境方法返回與提供的外部id匹配的記錄(external id):
>>> env.ref('base.group_public') res.groups(2)
ensure_one()
檢查記錄集是不是一個單例(只包含一個記錄),否則會產生一個錯誤:
records.ensure_one()
# is equivalent to but clearer than: assert len(records) == 1, "Expected singleton"
案例0002
filtered()
返回一個記錄集,其中只包含滿足所提供的斷言功能的記錄。斷言也可以是一個字符串,由字段為真或假來過濾:
通過條件過濾產生一個記錄集
# only keep records whose company is the current user's records.filtered(lambda r: r.company_id == user.company_id) # only keep records whose partner is a company records.filtered("partner_id.is_company")
sorted()
返回按所提供的key函數排序的記錄集。如果沒有提供key,請使用該模型的默認排序順序:
# sort records by name records.sorted(key=lambda r: r.name)
mapped()
將所提供的函數應用到記錄集中的每個記錄,如果結果是記錄集,則返回一個記錄集:
# returns a list of summing two fields for each record in the set records.mapped(lambda r: r.field1 + r.field2)
所提供的函數可以是一個字符串去獲取對應的字段值:
# returns a list of names records.mapped('name') # returns a recordset of partners record.mapped('partner_id') # returns the union of all partner banks, with duplicates removed record.mapped('partner_id.bank_ids')
計算字段(Computed fields)
可以使用compute參數計算字段(而不是直接從數據庫讀取)。它必須將計算的值分配給字段。如果它使用其他字段的值,那么它應該使用depends()來指定那些字段:
from odoo import api
total = fields.Float(compute='_compute_total') @api.depends('value', 'tax') def _compute_total(self): for record in self: record.total = record.value + record.value * record.tax
- 在使用子字段時,依賴項可以是虛線(dotted paths):(dependencies can be dotted paths when using sub-fields:)
@api.depends('line_ids.value') def _compute_total(self): for record in self: record.total = sum(line.value for line in record.line_ids)
- 計算字段不是默認存儲的,它們是在被請求時計算和返回的。設置
store=True會將它們存儲在數據庫中並自動啟用搜索 - 還可以通過設置
search參數來啟用計算字段。value是返回一個域的方法名:
upper_name = field.Char(compute='_compute_upper', search='_search_upper') def _search_upper(self, operator, value): if operator == 'like': operator = 'ilike' return [('name', operator, value)]
