odoo基础知识常用字段属性及方法使用

定义

  • 用途Related 字段用于引用其他模型或同一模型中其他字段的值。
  • 特点
    • 不存储在数据库中:每次调用时通过函数计算。
    • 存储选项:可以通过设置 store=True 将值存储到数据库中,从而支持搜索。

语法

field_name = fields.Related('related_model.field_name', string='Field Label', store=True)

示例

from odoo import models, fields

class MyModel(models.Model):
    _name = 'my.model'
    _description = 'My Model'

    related_field = fields.Related('related_model.field_name', string='Related Field', store=True)

    related_model = fields.Many2one('related.model', string='Related Model')

注意事项

  • 存储字段:如果需要对 Related 字段进行搜索,必须设置 store=True
  • 性能:存储字段会增加数据库大小,但可以提高搜索性能。

2. Computed 字段

定义

  • 用途Computed 字段用于根据其他字段动态计算值。
  • 特点
    • 不存储在数据库中:每次调用时通过函数计算。
    • 存储选项:可以通过设置 store=True 将值存储到数据库中,从而支持搜索。
    • 只读:默认情况下是只读的,可以通过 inverse 方法使其可写。

语法

field_name = fields.Char(compute='_compute_field', inverse='_inverse_field', search='_search_field', store=True)

示例

from odoo import models, fields, api

class MyModel(models.Model):
    _name = 'my.model'
    _description = 'My Model'

    employee_name = fields.Char(string='Employee Name')
    upper = fields.Char(compute='_compute_upper', inverse='_inverse_upper', search='_search_upper', store=True)

    @api.depends('employee_name')
    def _compute_upper(self):
        for rec in self:
            rec.upper = rec.employee_name.upper() if rec.employee_name else False

    def _inverse_upper(self):
        for rec in self:
            rec.employee_name = rec.upper.lower() if rec.upper else False

    def _search_upper(self, operator, value):
        if operator == 'like':
            return [('employee_name', 'ilike', value.upper())]
        return []

注意事项

  • 计算依赖:使用 @api.depends 装饰器指定依赖字段,确保计算字段在相关字段变化时重新计算。
  • 存储字段:如果需要对 Computed 字段进行搜索,必须设置 store=True
  • Inverse 方法:通过 inverse 方法使计算字段可写,反转计算并设置相关字段。

常用装饰器

@api.multi

  • 用途:处理记录集。
  • 示例
    @api.multi
    def my_method(self):
        for record in self:
            # 处理每条记录
    

@api.model

  • 用途:静态方法,self 参数是一个对象的引用而非记录集。
  • 示例
    @api.model
    def my_method(self):
        # 静态方法逻辑
    

@api.depends

  • 用途:指定计算字段的依赖字段。
  • 示例
    @api.depends('field1', 'field2')
    def _compute_field(self):
        for rec in self:
            rec.computed_field = rec.field1 + rec.field2
    

@api.constraints

  • 用途:用于评估和检查字段值。
  • 示例
    @api.constraints('field1', 'field2')
    def _check_field(self):
        for rec in self:
            if rec.field1 < 0 or rec.field2 < 0:
                raise ValidationError("Fields must be non-negative")
    

@api.onchange

  • 用途:在用户界面交互时自动更新相关字段。
  • 示例
    @api.onchange('field1')
    def _onchange_field1(self):
        if self.field1:
            self.field2 = self.field1 * 2
    

ORM 内置方法

create(values)

  • 用途:创建新记录。
  • 示例
    new_record = self.create({'field1': 'value1', 'field2': 'value2'})
    

write(values)

  • 用途:更新记录。
  • 示例
    self.write({'field1': 'new_value1', 'field2': 'new_value2'})
    
  • 用途:删除记录。
  • 示例
    self.unlink()
    

search(domain, offset=0, limit=None, order=None, count=False)

  • 用途:根据条件搜索记录。
  • 示例
    records = self.search([('field1', '=', 'value1')])
    

search_read(domain, fields=None, offset=0, limit=None, order=None)

  • 用途:搜索并读取记录。
  • 示例
    records = self.search_read([('field1', '=', 'value1')], ['field1', 'field2'])
    

browse(ids)

  • 用途:根据 ID 获取记录集。
  • 示例
    records = self.browse([1, 2, 3])
    

read(fields)

  • 用途:读取记录的指定字段。
  • 示例
    records = self.read(['field1', 'field2'])
    

copy(default=None)

  • 用途:复制记录。
  • 示例
    new_record = self.copy({'field1': 'new_value1'})
    

数据导入导出方法

load(fields, data)

  • 用途:从 CSV 文件导入数据。
  • 示例
    self.load(['field1', 'field2'], [{'field1': 'value1', 'field2': 'value2'}])
    

export_data(fields, raw_data=False)

  • 用途:导出数据到 CSV 文件。
  • 示例
    data = self.export_data(['field1', 'field2'])
    

UI 相关方法

name_get()

  • 用途:返回 (ID, name) 元组列表。
  • 示例
    def name_get(self):
        result = []
        for record in self:
            result.append((record.id, record.name))
        return result
    

name_search(name='', args=None, operator='ilike', limit=100)

  • 用途:根据输入名称搜索记录。
  • 示例
    def name_search(self, name='', args=None, operator='ilike', limit=100):
        args = args or []
        if name:
            args += [('name', operator, name)]
        return self.search(args, limit=limit).name_get()
    

name_create(name)

  • 用途:根据名称快速创建记录。
  • 示例
    def name_create(self, name):
        return self.create({'name': name}).name_get()[0]
    

default_get(fields)

  • 用途:返回新记录的默认值。
  • 示例
    def default_get(self, fields):
        defaults = super(MyModel, self).default_get(fields)
        defaults['field1'] = 'default_value'
        return defaults
    

其他方法

search_count(domain)

  • 用途:查询记录数量。
  • 示例
    count = self.search_count([])
    

fields_get(allfields=None, attributes=None)

  • 用途:获取字段定义。
  • 示例
    @api.model
    def fields_get(self, allfields=None, attributes=None):
        res = super(MyModel, self).fields_get(allfields, attributes)
        for key, value in res.items():
            if key == 'create_date':
                res[key]['string'] = '创建时间'
            elif key == 'write_date':
                res[key]['string'] = '最后更新时间'
        return res
    

invalidate_all()

  • 用途:清空缓存。
  • 示例
    self.env.invalidate_all()
    

服务器环境

self.env

  • 用途:访问当前用户运行的环境信息。
  • 属性
    • env.cr:当前的数据库光标。
    • env.user:当前用户的记录。
    • env.uid:会话中用户的 ID。
    • env.context:会话上下文的不可变字典。
  • 方法
    • env.with_context(dictionary):改变上下文信息。
    • env.sudo(user):以指定用户执行操作,跳过安全规则。

事务和底层 SQL

self.env.cr

  • 方法
    • commit():提交事务。
    • savepoint():设置保存点。
    • rollback():回滚事务。
    • fetchall():获取所有记录。
    • invalidate_all():清空缓存。

Context

用途

  • 传递信息:从一个视图传递到下一个视图。
  • 默认值:设置目标视图的默认值或激活默认筛选器。
  • 示例
    context = {'default_user_id': self.env.user.id}
    

Domain 表达式

常见操作符

  • 比较符号<, >, <=, >=, =, !=
  • 模式匹配=like, like, not like, not ilike
  • 子节点child of
  • 列表包含in, not in
  • 逻辑运算符&(AND), |(OR)。

查询模型

search(domain, offset=0, limit=None, order=None, count=False)

  • 用途:根据条件搜索记录。
  • 示例
    records = self.search([('field1', '=', 'value1')])
    

browse(ids)

  • 用途:根据 ID 获取记录集。
  • 示例
    records = self.browse([1, 2, 3])
    

操作记录集

常用操作

  • 包含/排除
    • x in the_recordset
    • x not in the_recordset
  • 获取 ID 列表
    • recordset.ids
  • 过滤
    • recordset.filtered(func)
  • 映射
    • recordset.mapped(func)
  • 排序
    • recordset.sorted(func)

集合操作

  • 并集
    • rs1 | rs2
  • 交集
    • rs1 & rs2
  • 差集
    • rs1 - rs2
  • 切片
    • rs[0], rs[-1], rs[1:]

关系字段

多对一 (Many2one)

  • 示例
    related_model = fields.Many2one('related.model', string='Related Model')
    

一对多 (One2many)

  • 示例
    related_records = fields.One2many('related.model', 'inverse_field', string='Related Records')
    

多对多 (Many2many)

  • 示例
    related_records = fields.Many2many('related.model', string='Related Records')
    

总结

  • Related 字段:用于引用其他模型或同一模型中的字段,不存储在数据库中,可以通过 store=True 存储。
  • Computed 字段:用于动态计算字段值,不存储在数据库中,可以通过 store=True 存储,并且可以通过 inverse 方法使其可写。
  • 装饰器@api.multi, @api.model, @api.depends, @api.constraints, @api.onchange 等用于处理不同场景下的逻辑。
  • ORM 方法create, write, unlink, search, search_read, browse, read, copy 等用于操作记录。
  • Context:用于传递信息和设置默认值。
  • Domain 表达式:用于构建搜索条件。
  • 服务器环境:通过 self.env 访问当前环境信息。
  • 事务和底层 SQL:通过 self.env.cr 进行事务操作。

这些方法和字段类型在 Odoo 开发中非常常用,掌握它们可以帮助你更好地设计和实现复杂的业务逻辑。

posted @ 2024-08-05 11:37  nn_ning  阅读(196)  评论(0)    收藏  举报