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