odoo里面的一些ORM操作


案例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)]
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM