跳至内容

Odoo 中的选择字段:完整指南

关于Odoo数据模型中Selection字段的所有信息,从基本用法到技术定制
2026年3月6日
Odoo 中的选择字段:完整指南
Dasolo
| 还没有评论

介绍


每当用户选择潜在客户优先级、选择支付方式或在Odoo中将产品标记为活动或归档时,他们很可能正在与选择字段进行交互。它是Odoo框架中最实用的字段类型之一,也是如果您想构建干净、可靠的数据模型,最重要的理解之一。


与用户可以输入任何内容的自由文本字段不同,选择字段将输入限制为预定义的选项列表。这个限制就是重点。它保持您的数据一致,使过滤和报告更准确,并防止那种随着时间推移悄然破坏聚合和仪表板的拼写错误和变体。


本指南涵盖了从字段存储的内容及其在界面中的显示方式,到通过Odoo Studio、Python模块或XML-RPC API创建和自定义它的所有内容。您还会找到来自真实业务工作流程的实际示例以及常见错误的列表。

Odoo中的选择字段是什么


在Odoo ORM中,选择字段存储从固定选项列表中选择的字符串值。每个选项被定义为键值对:键是保存在数据库中的内容,标签是用户在界面中看到的内容。


例如,优先级字段可以定义为以下选项:

priority = fields.Selection([
    ('0', '正常'),
    ('1', '低'),
    ('2', '高'),
    ('3', '非常高'),
], string='优先级', default='0')

在这个例子中,'0''1''2''3' 是存储在数据库中的键。标签 正常非常高 是用户在屏幕上看到的内容。这种分离在后期更改标签而不破坏现有记录时非常重要。


在界面中,选择字段在表单视图中显示为下拉列表。在列表视图中,它显示人类可读的标签。当使用 badge 小部件时,每个选项呈现为一个彩色标签,使得在密集的列表视图中值立即可见。


在 Odoo Studio 中,这种字段类型称为 选择 字段。通过 Studio 创建时,它会获得 x_studio_ 前缀。通过代码或 XML-RPC API 创建时,您可以选择技术名称。

字段是如何工作的


在 Odoo 数据模型中,选择字段以 VARCHAR 列的形式存储在 PostgreSQL 中。数据库只存储键,而不存储标签。在编写域过滤器或服务器操作时,记住这一点非常重要,因为您需要使用键,而不是人类可读的值。


例如,要搜索所有高优先级的潜在客户,您的域应为 [('priority', '=', '2')],而不是 [('priority', '=', '高')]

关键字段属性

以下是 Odoo 框架中选择字段最重要的属性:

  • selection:定义可用选项的 (key, label) 元组列表。这也可以是返回列表的方法名称(字符串)。
  • default:在尚未设置值时使用的选项的键。如果省略,则字段开始为空。
  • required:强制用户在保存之前选择一个选项。与默认值结合使用,这是状态字段的常见模式。
  • selection_add: 用于模块继承,以在不重新定义整个列表的情况下向现有选择字段添加新选项。当扩展原生字段时,这是正确的方法。
  • ondelete: 与 selection_add 一起工作,以定义在卸载添加了该选项的模块时,已删除选项的记录会发生什么。

静态与动态选择列表

默认情况下,选项列表在字段声明中静态定义。但您也可以将方法名称作为字符串传递给 selection 参数。Odoo 会在运行时调用该方法来构建列表,这使您可以根据当前用户、当前公司或任何其他上下文显示不同的选项。


contract_type = fields.Selection(
    selection='_get_contract_types',
    string='合同类型'
)

def _get_contract_types(self):
    if self.env.user.has_group('hr.group_hr_manager'):
        return [('permanent', '永久'), ('fixed', '固定期限'), ('interim', '临时')]
    return [('permanent', '永久'), ('fixed', '固定期限')]

在视图中的显示方式

在表单视图中,选择字段呈现为标准下拉菜单。您还可以使用 widget="badge" 属性将其呈现为彩色标签,这在状态字段的列表和看板视图中效果很好。widget="radio" 属性将选项呈现为内联单选按钮,适合选择数量较少的字段,您希望一次性显示所有选项。


与 Odoo ORM 的交互

在 Odoo ORM 中读取和写入选择字段非常简单。您直接分配键,框架会自动处理显示映射。当通过 XML-RPC API 使用 fields_get 读取记录时,字段的 selection 属性包括完整的 [key, label] 对列表,您可以使用这些对在外部工具中构建自己的显示逻辑。


业务用例


选择字段几乎出现在标准 Odoo 实现的每个模块中。以下是来自常见业务工作流程的五个具体示例。


CRM:潜在客户优先级和管道阶段类型

CRM 潜在客户上的优先级字段是一个原生选择字段,具有四个级别:正常、低、高和非常高。销售团队使用它来将注意力集中在最有前景的机会。它直接影响看板视图的颜色编码,并可用于自动化操作,以在潜在客户升级时触发后续任务。正确获取优先级分布是大多数 CRM 团队在上线后进行的数据质量改进之一。


销售:付款条款和发票政策

产品上的 invoice_policy 字段是一个选择字段,用于控制发票是基于订购数量还是交付数量。这个单一字段决定了产品的整个计费流程。同样,订阅合同上的计费模式使用选择字段来区分预付费和后付费计费周期。这两个都是选择字段的良好示例,对财务工作流程有显著的下游影响。


库存:产品和批次质量状态

在制造和质量控制工作流程中,选择字段用于跟踪批次、序列号和维修订单的状态。例如,维修订单状态字段的值会在草稿、确认、维修中、准备好和完成之间变化。每个过渡都可以触发自动电子邮件、库存移动或会计条目。选择字段作为整个工作流程构建的控制点。


会计:付款方式和日记账类型

Odoo会计中的日记账类型字段是一个选择字段,用于区分销售日记账、采购日记账、现金日记账和银行日记账。Odoo使用这个值来应用正确的过账逻辑,确定可用的账户,并将某些操作限制在正确的日记账类型中。这是一个控制业务规则的选择字段的良好示例,而不仅仅是标记记录。


人力资源:雇佣类型和合同状态

人力资源团队使用选择字段来跟踪雇佣类型、合同状态和请假请求状态。例如,合同状态从新建到开放,再到过期或取消。自动化可以在合同到期前一个月通知人力资源经理,当新员工入职时触发入职检查表,并根据雇佣类型更新工资规则。选择字段持有驱动所有这些逻辑的状态。

创建或自定义选择字段


根据您的设置以及您是否需要将更改版本控制或以编程方式应用,有三种主要方法可以将选择字段添加到Odoo模型中。


使用Odoo Studio(无代码)

Odoo Studio是内置的低代码工具,用于在不编写任何Python代码的情况下添加字段。通过Studio添加选择字段的方法是:

  1. 从主菜单打开Odoo Studio。
  2. 导航到您想要添加字段的表单。
  3. 从侧边栏拖动一个 选择 字段到表单上。
  4. 在字段属性面板中添加您的选项,为每个选项输入标签。
  5. 可选地设置默认值并将字段标记为必填。
  6. 保存并关闭 Studio。

Studio 会将每个选项与自动生成的键和您提供的标签一起存储。该字段会自动添加 x_studio_ 前缀,并自动添加到表单视图中。这是在与客户进行业务分析会议期间添加选择字段的最快方法。


在自定义模块中使用 Python

对于构建 Odoo 模块的开发人员,选择字段在 Python 模型文件中定义。这是需要版本控制并在多个环境中部署的自定义的推荐方法:

from odoo import fields, models

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    x_delivery_slot = fields.Selection([
        ('morning', '早上 (8h - 12h)'),
        ('afternoon', '下午 (13h - 17h)'),
        ('evening', '晚上 (18h - 20h)'),
    ], string='交付时间段', default='morning')

定义字段后,您需要将其添加到相关的视图 XML 文件中,以便它出现在界面中。Odoo 在您安装或升级模块时处理数据库列的创建。


当扩展一个原生字段并添加新选项时,请使用 selection_add 而不是重新定义字段:

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    state = fields.Selection(
        selection_add=[('custom_approval', '待审批')],
        ondelete={'custom_approval': '设置为默认'}
    )

使用 XML-RPC API

如果您正在以编程方式管理 Odoo 自定义,例如作为部署管道或远程配置笔记本的一部分,您可以通过 XML-RPC API 创建选择字段:

field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_contract_category',
        'field_description': '合同类别',
        'model_id': model_id,
        'ttype': 'selection',
        'selection': "[('standard', '标准'), ('premium', '高级'), ('custom', '自定义')]",
        'state': 'manual',
    }]
)

请注意,通过 API 创建选择字段时,selection 值作为 Python 列表的字符串表示形式传递。state: manual 值告诉 Odoo 该字段是手动创建的,这是通过 Studio 或 API 创建字段的正确设置。这就是 Dasolo 如何处理客户的远程字段创建作为自动化配置脚本的一部分。


最佳实践


1. 使用有意义且稳定的键

键是存储在数据库中并用于域过滤器、自动化操作和服务器端逻辑的内容。选择一个清晰描述选项的键,并且您以后不需要更改。短小的全小写字符串效果很好:'draft''confirmed''cancelled'。避免使用数字键,除非序列确实很重要,因为它们会使您的代码在几个月后更难阅读和理解。


2. 保持列表简短且详尽

一个选择字段如果有超过八或十个选项,通常意味着该字段试图做太多。如果列表不断增长,请考虑是否与配置模型建立 Many2one 关系会更合适。这使用户能够通过界面自行管理选项,而无需开发人员更新代码或数据库字段定义。


3. 始终为必填字段设置默认值

如果选择字段是必填的,还应设置一个合理的默认值。这可以防止在通过编程、导入或通过 API 创建记录时出现验证错误,因为用户不在场无法进行选择。默认值应代表工作流中最常见或最少承诺的状态。


4. 在扩展原生字段时使用 selection_add

如果您需要在自定义模块中向现有 Odoo 字段添加选项,请使用 selection_add 而不是重新定义整个字段。这更安全,并且与可能也扩展同一字段的其他模块更兼容。始终将其与 ondelete 参数配对,以处理您的模块卸载时发生的情况。


5. 在列表视图中使用徽章小部件以提高可见性

在列表和看板视图中,选择字段的默认渲染仅为文本。在视图 XML 中添加 widget="badge" 属性会将每个值转换为彩色标签,使该字段在一瞥之间更容易扫描。这对于用户需要快速识别需要关注的记录的状态字段尤其有用。


常见陷阱


更改键会破坏现有数据

选择选项的标签可以随时安全更改,因为数据库中仅存储键。然而,一旦存在具有该值的记录,键绝不能更改。如果您重命名一个键,所有具有旧键的现有记录将在界面中显示为空或无效值,并且任何使用旧键的域过滤器或自动化将静默停止工作。如果确实需要更改键,您必须先运行数据迁移脚本以更新所有现有记录。


删除选项会留下孤立记录

如果您在仍持有该键的记录存在时从列表中删除一个选项,这些记录将显示缺失或损坏的值。在删除任何选项之前,请搜索仍在使用它的记录,并将其更新为有效值或归档。这是在数据清理项目中常见的问题,因为选项列表的设计没有进行足够的前期分析。


在域过滤器中使用标签而不是键

一个非常常见的错误,尤其是对于在 Odoo 界面中编写自动化规则的非技术用户,是按人类可读的标签而不是存储的键进行过滤。这会产生一个返回零结果的域,而不会引发错误,这可能很难诊断。在编写过滤器之前,请始终检查字段定义以确认哪个键对应于哪个标签。


在更合适的 Many2one 中使用选择字段

如果选项列表经常变化,如果用户需要在没有开发人员参与的情况下自行管理它,或者如果选项带有额外的属性,如颜色、序列或关联账户,那么与配置模型的 Many2one 关系是更好的选择。选择字段非常适合稳定的、由开发人员管理的列表。对于任何更动态的情况,Many2one 从长远来看更易于维护。


未在服务器端逻辑中处理空值

一个非必需的选择字段在未选择任何选项时可以持有 False 值。如果您的 Python 代码或自动化操作在未先检查 False 的情况下将字段值与字符串进行比较,您将会遇到意外的行为或错误。始终在依赖选择字段的服务器操作和计算字段中明确处理空值情况。

结论


选择字段是那些看似简单但一旦了解其内部工作原理后就会发现其深度的字段类型之一。了解键与标签之间的区别,理解何时使用 selection_add 而不是重新定义字段,以及识别何时使用 Many2one 更为合适,这些都是将良好设计的 Odoo 实现与一年后可能引发问题的实现区分开来的关键区别。


无论您是通过 Odoo Studio 添加合同类型,还是在自定义 Python 模块中定义交付时间段字段,或通过 API 创建质量状态字段,本指南中描述的模式都能为您提供所需的信息,以便为您的用例做出正确的决策。

在 Odoo 数据模型中,选择字段是强制数据质量的主要工具之一。使用得当,它可以保持您的记录整洁,报告准确,以及自动化可靠。

在 Dasolo,我们帮助公司在各个部门实施、定制和优化 Odoo。无论您需要帮助设计干净的数据模型,向工作流程添加自定义字段,还是从头构建完整的 Odoo 模块,我们的团队都在这里为您提供帮助。 联系我们 让我们谈谈您的 Odoo 项目。

Odoo 中的选择字段:完整指南
Dasolo 2026年3月6日
分析这篇文章
登录 留下评论