Skip to Content

Odoo 18中的自动字段和预留字段

Odoo 18中的自动字段和预留字段


作为一个开源平台,Odoo的价值在于其使用和开发的灵活性、可扩展性和经济性。虽然Odoo本身主要用Python和JavaScript编写,但其作为开源ERP系统的价值超越了特定编程语言的范畴,为各行各业的企业提供了可定制且适应性强的运营管理解决方案。

在探讨Odoo 18模块开发时,字段是模型的基本构建块,代表着系统中存储的数据。这些字段定义了Odoo模型(对应数据库中的表)的数据结构,并用于创建表单、视图和管理业务逻辑。实际上,字段是指映射类的属性或特性,对应于数据库表中的列。

在Odoo 18中,自动字段(Automatic Fields) 和 预留字段(Reserved Fields) 指的是系统为实现各类功能而在内部进行管理的字段。这些字段通常不由开发者或用户显式创建,而是由Odoo基于模型定义自动添加,或者是Odoo为特定目的预定义的字段。

让我们通过示例详细探讨这两类字段。

1. 自动字段

自动字段是Odoo根据模型的需求和配置自动管理或生成的字段。这些字段通常由对象关系映射(ORM)添加,ORM是编程语言和数据库之间的桥梁。

  • id:此自动字段负责为模型中的每条记录提供唯一标识。每条记录都必须包含其唯一的ID,该ID由系统自动管理且永久不变。在启用调试模式后,可以在记录的URL中看到 “id ”字段。
  • create_date:此记录创建时的时间戳,并由系统自动维护。用户无法更改此字段,因为它是自动添加的。
  • create_uid:此保存创建记录的用户。它是一个Many2one字段,关联的模型为res.users。因此,create_uid包含创建记录的用户的ID。
  • write_date:此为记录最后一次修改的时间戳字段。write_date也是一个只读属性,因为只要记录中其他任何字段的值发生变化并保存,系统就会自动更新该值。
  • write_uid:此系统字段也是一个Many2one字段,关联的模型为res.users,用于保存最后修改记录的用户的ID。此字段用于跟踪记录的最新更新,并保留详细信息(例如负责最新更改的用户)。它在审计与调试方面具有重要价值,还可用于实施访问控制,限制特定用户对记录的更新操作。

上述字段会自动添加到每个模型中,便于系统追踪每条记录的创建者与修改者,以及更改发生的时间。

log_access:在Odoo中,log_access是模型层面的一个特殊属性,用于启用或禁用访问元数据的自动记录(例如创建和修改时间戳以及执行这些操作的用户)。默认情况下,Odoo会为所有模型记录这些数据,但开发者可通过将 “log_access” 设置为 “False” 来禁用该功能。若在创建模型时未禁用log_access,Odoo会自动在数据库中添加create_uid、create_date、write_uid和write_date字段。也就是说,它允许开发者控制是否应为模型自动记录访问元数据(如创建和修改信息)。

2. 保留字段

保留字段是Odoo为系统内部特定功能预定义的字段。这些字段通常也由对象关系映射(ORM)添加。保留字段是Odoo框架核心操作所需的字段,除非它们服务于相同的角色,否则不能用于其他目的。一些常见的示例包括:

  • name:该字段通常默认使用所定义模型的 “_rec_name” 值。name是跨各种模型最重要且最常用的字段之一。它通常用作模型的主要字符串标识符。当在Many2one字段、列表或表单视图中引用记录时,用户看到的就是 “name” 字段的值。
  • active:这是一个布尔字段,用于将记录“归档”或“停用”,使用的是 “Odoo.fields.active”。若记录的 “active” 为 “False”,那么在大多数视图和报表中,该记录实际上会被 “隐藏”。“active” 为 “False” 的数据会一直保留在数据库中,用户可按需检索。也就是说,这些数据会一直存于 “回收站”,直至被永久删除。此字段的定义如下:
    active = fields.Boolean('Active', default=True)
  • company_id:在多公司设置中,此保留字段company_id通过将模型中的记录与特定公司关联来发挥作用。这是一个Many2one引用字段,关联的模型为res.company,因此模型中的每条记录只会保存当前已创建公司列表中的某一家公司信息。许多公司使用此字段来实行多公司规则和数据隔离,语法如下:
    company_id = fields.Many2one('res.company', string="Company", help='Company',default=lambda self: self.env.user.company_id)
  • state:state字段通常用于管理工作流或流程中记录的不同阶段或状态。它通常设置为一个选择字段,其中每个值对应于记录生命周期的不同状态。例如,在销售订单、采购订单和发票等模型中,state字段可追踪记录从草稿到完成或取消的进度。示例:
    state = fields.Selection([
        ('draft', 'Draft'),
        ('confirmed', 'Confirmed'),
        ('done', 'Done'),
        ('cancel', 'Cancel')], string='Status', default='draft')
  • parent_id:此字段用于创建层级关系。parent_id字段通常是一个Many2one关系,将一条记录链接到同一模型的另一条记录(即自引用)。
  • parent_path:在开发具有上述层级关系的Odoo模型时,parent_path字段用于表示记录的完整层次路径。parent_path字段存储一个字符串,其中包含从顶级父记录到当前记录的完整路径,从而使层级操作(例如搜索特定父记录的所有子记录)更快、更高效。

总结

Odoo中的自动字段与预留字段,其作用都是在数据库中保存Odoo模型记录的元数据。这些字段通常与数据库结构、记录管理和系统操作相关。理解这些字段及其用法将帮助开发者确保自定义内容与Odoo框架兼容,从而保持系统的完整性。

Odoo 18中的自动字段和预留字段
中国 Odoo, 苏州远鼎 March 21, 2025
Tags
Archive