Odoo产品变体搜索:如何从产品模板字段添加高级搜索功能

本教程详细介绍了如何在odoo中为产品变体(`product.product`)列表视图添加基于产品模板(`product.template`)字段的自定义搜索功能。文章将引导读者通过定义关联字段、修改搜索视图xml,并重点强调使用`filter_domain`而非`domain`属性来正确构建搜索逻辑,从而解决常见的跨模型搜索难题。

在Odoo的开发实践中,经常需要扩展现有模型的功能,例如为产品变体(product.product)添加基于其所属产品模板(product.template)字段的搜索能力。直接在product.product的搜索视图中引用product.template上的字段会遇到问题,因为搜索字段的domain属性处理方式与预期不同。本教程将详细阐述如何正确实现这一功能。

1. 扩展产品模板模型

首先,我们需要在product.template模型中添加一个自定义字段。例如,我们添加一个名为model_number的字符型字段来存储产品型号。

from odoo import fields, models

class ProductTemplate(models.Model):
    _inherit = 'product.template'

    model_number = fields.Char(string='型号', required=True)

这段代码通过继承product.template模型,引入了一个新的必填字符型字段model_number。

2. 在产品变体模型中创建关联字段

为了让product.product模型能够直接访问product.template上的model_number字段,我们需要在product.product模型中定义一个关联字段。这个关联字段将通过product_tmpl_id(product.product到product.template的Many2one字段)来获取model_number。

from odoo import fields, models

class ProductProduct(models.Model):
    _inherit = 'product.product'

    model_number_search = fields.Char(
        string='产品型号',
        related='product_tmpl_id.model_number',
        store=True, # 设置store=True可以提高搜索性能,因为它会在数据库中存储该字段的值
        readonly=True # 关联字段通常设置为只读
    )

这里,model_number_search字段通过related属性关联到product_tmpl_id.model_number。store=True的设置非常重要,因为它会使这个关联字段的值实际存储在product.product表中,从而允许数据库对其进行索引和高效搜索。

3. 修改产品变体搜索视图

现在,我们可以在product.product的搜索视图中添加一个字段,用于搜索model_number_search。关键在于使用filter_domain属性而不是domain。


    
        product.product.search.form.view.inherit
        product.product
        
        
            
               
            
        
    

在这段XML代码中:

纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

30

查看详情

  • 我们通过inherit_id继承了Odoo默认的product.product_search_form_view。
  • xpath表达式用于在现有name字段之后插入我们的自定义搜索字段。
  • 新添加的field名为model_number_search,其string属性定义了在搜索框中显示的标签。
  • 核心改动: filter_domain="[('model_number_search', 'ilike', self)]"。这里使用了filter_domain属性,而不是domain。当用户在搜索框中输入内容时,self会代表用户输入的值,filter_domain会根据这个值构建实际的搜索条件,并应用于product.product模型上的model_number_search字段。

4. filter_domain与domain的区别

理解filter_domain和domain的区别是解决此类问题的关键:

  • domain属性: 主要用于定义字段的可选值范围,或者在视图中对记录集进行静态过滤。当应用于field标签时,它通常限制该字段能显示哪些值,或在关联字段的下拉列表中过滤选项。
  • filter_domain属性: 专为搜索视图中的field标签设计。它的作用是根据用户在搜索框中输入的值,动态地构建一个搜索域(domain),并将其应用到当前模型上。self关键字在filter_domain中代表用户输入的搜索值。

错误的尝试通常是使用domain="[('product_tmpl_id.model_number', 'ilike', self)]"。这会导致错误,因为domain属性在搜索字段中不能直接用于动态构建跨模型的搜索条件,特别是当字段本身不是关系字段时。filter_domain才是处理这种情况的正确机制。

5. 总结与注意事项

通过以上步骤,您已经成功地为Odoo的产品变体列表视图添加了基于产品模板字段的自定义搜索功能。

关键要点回顾:

  1. 扩展product.template: 添加您需要的自定义字段。
  2. 在product.product中创建关联字段: 使用related属性将product.template上的字段映射到product.product上,并设置store=True以优化搜索性能。
  3. 修改搜索视图: 在product.product的搜索视图中添加新的field,并务必使用filter_domain属性来定义搜索逻辑,其中self代表用户输入的值。
  4. 理解filter_domain: 它是专门用于搜索视图字段的动态域构建机制,与普通domain的用途不同。

完成代码修改后,请确保升级您的Odoo模块,以便数据库结构和视图定义能够正确更新。这样,用户就能在产品变体界面通过型号字段进行高效搜索了。

以上就是Odoo产品变体搜索:如何从产品模板字段添加高级搜索功能的详细内容,更多请关注昆居客【www.kunjuke.com】。

相关推荐:

沐曦股份:“公司部分产品订单已经排到明年甚至之后”传闻不属实

7 月 9 日消息,沐曦股份今日发布澄清公告,公司关注到有媒体报道称,公司相关人员近期在接受采访时表示,公司部分产品订单已经排到明年甚至之后。经公司核查,上述传闻不属实。公司首席产品官、高级副总裁孙国梁先生在“活力中国调研行”上海站活动中的发言,未对公司订单情况发表观点。公司目前生产经营正常,不存在应披露而未披露的重大信息。敬请广大投资者理性解读,注意投资风险。沐曦股份还表示,近期,公司股票价格累...

小米汽车官宣全新产品系列:SkyNomad 小米澎程智能可变大空间 SUV

感谢网友 顺势而为 的线索投递! 7 月 9 日消息,今天上午,小米公司官微发文宣布,SkyNomad 小米澎程将推出智能可变大空间 SUV,这也是小米汽车旗下的全新产品系列。把官方预告海报放大,还可隐约看见新车的外观轮廓。不同于 SU7 和 YU7 的动感曲线,这款 SUV 显得格外硬朗,前脸也将采用全新设计。小米方面称,这款车将支持车内空间随你心意、自由变换。“一辆车,容纳生活的无限可能,这是...

铠侠-闪迪 BiCS10(332 层)3D NAND 闪存进入出样阶段,首款产品为 1Tb TLC

7 月 3 日消息,铠侠-闪迪联盟现已宣布,由双方合作开发的第 10 代 BiCS FLASH 3D 闪存现已启动样品交付,首款产品为 1Tb TLC。BiCS10 采用 332 层堆叠设计,由铠侠日本岩手北上 Fab2 晶圆厂生产,延续了 BiCS8 时代导入的 CMOS 直接键合到阵列 (CBA) 和节距选通 (OPS) 两大新技术。BiCS10 1Tb TLC 支持 Toggle DDR6....

如何在Python中为测试用例添加自定义标记_通过pytest.mark进行分类执行

pytest.mark 必须作为装饰器直接作用于测试函数或类,不可写在函数外部;可叠加多个标记,执行时用 -m "mark1 and mark2" 等布尔表达式筛选;未注册标记会触发警告,需在 pytest.ini 或 pyproject.toml 中声明以避免。 pytest.mark 能不能直接用在函数外面 不能。所有 pytest.mark 必须装饰在测试函数或类上,写在函数定义之外会报 S...
· Python · 223603

如何在Python中构建树状结构的递归生成器_使用yield from简化递归代码

yield from 在树遍历中省去了手动展开子生成器的繁琐与风险,自动处理委托调用、异常传播、StopIteration 捕获及协程方法转发,确保扁平化输出和行为一致性。 yield from 在树遍历中到底省了什么 直接说结论:yield from 不是语法糖,它把递归生成器的“委托调用”从手动循环 + yield 拆解成一条语句,避免了中间迭代器被提前耗尽、异常传播断裂、或 StopIter...
· Python · 77082

如何解决Python中的UnboundLocalError局部变量引用错误_使用global或nonlocal关键字声明

Python函数内同名变量报UnboundLocalError,因编译期将赋值变量标记为局部,读取在赋值前则出错;global用于模块级变量,nonlocal用于最近外层函数变量,二者不可混用且需提前声明。 为什么在函数里修改同名变量会报 UnboundLocalError Python 在编译函数时,只要看到某个变量在函数体内有赋值操作(哪怕只在 if 分支里),就会把它标记为局部变量。之后如果...
· Python · 256729

为什么Python脚本内存占用居高不下_使用objgraph与gc模块排查泄露

Python内存泄漏主因是对象被隐性持有而非未调gc.collect(),可用objgraph.show_growth()定位异常增长类型,再用gc.get_referrers()逆向追踪强引用源,并结合RSS监控与gc调试确认真实泄漏。 Python 脚本内存持续上涨,大概率不是“没调 gc.collect()”,而是对象根本没被识别为可回收——比如被全局容器悄悄持有、含 __del__ 的循环...
· Python · 289462

如何在Python Flask中集成Click命令行工具_使用app.cli.command

app.cli.command命令不出现的主因是Flask实例未完成初始化或注册时机过早;需确保在create_app()返回后注册,且装饰器顺序为@app.cli.command在上、@click.option等在下,同时避免顶层导入时执行注册。 为什么 app.cli.command 注册的命令不出现? 最常见原因是 Flask 应用实例未正确初始化 CLI 上下文,或者命令注册时机早于 ap...
· Python · 249029