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)]
 
posted @ 2019-09-03 21:57  何双新  阅读(1734)  评论(0编辑  收藏  举报