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)]
心有猛虎,细嗅蔷薇