【问题标题】:Odoo Custom filter functionOdoo 自定义过滤功能
【发布时间】:2021-04-08 16:20:48
【问题描述】:

我已经尝试了所有方法并到处寻找答案,但我没有成功。

我想实现一个自定义函数来检索 Many2one 选择列表的过滤值。 通常您会为此使用域,但给出的域选项不足以实现我的目标。

我必须重写什么函数来修改给定 Many2one 字段的选择列表?

谢谢, 拉尔斯

更新:

感谢您的回答。我使用name_search 来分析生成的WHERE 子句。 以下是我想要实现的目标和迄今为止的发现:

programs = fields.Many2many(
        comodel_name='hr.program',
        relation='hr_process_onboarding_wizard_programs')
program_department = fields.Many2one(
        comodel_name='hr.department',
        domain="[('programs', 'in', programs)]")

字段 programs 表示为 many2many_checkboxes 小部件。 当我选择 2 个值时,以下域过滤器被传递给 name_search['programs', 'in', [1, 2]]

这将生成以下 SQL 查询(有趣部分的摘录):(SELECT "hr_department_id" FROM "hr_programs_departments" WHERE "hr_program_id" IN (1,2))

结果列表当然是程序 [1,2] 的 UNION,但我希望程序 [1,2] 的 INTERSECTION。

Afaik 没有域过滤器来获取交集。

更新 2:

在考虑了给定的过滤器运算符之后,我希望 = 完全符合我的要求,但运算符 = 正在生成与 in 相同的 WHERE 子句。

【问题讨论】:

  • 请提供输入数据样本和所需输出
  • 第一个猜测:覆盖name_search()

标签: python odoo odoo-14


【解决方案1】:

我认为我们在同一页面上,我想推荐 _search 方法,因为每次当您使用您的书面域点击 many2one 字段时,此 _search 方法在 py 或 xml 中。

您可以覆盖它并做有用的事情。

当您覆盖此类方法时,您需要注意一件事。 我建议您在 _search 方法中传递上下文和一个条件(在所有代码之上),这样您的代码就不会影响到其他地方,因为 _search 方法无处不在。

谢谢

【讨论】:

  • _search 在这里不适用,因为program_department 不是计算字段。
  • 我认为您建议的 name_search 方法间接称为 _search 方法,因此我们将同样的概念应用于搜索方法。
【解决方案2】:

这是我在HrDepartment 类中使用name_search 的快速破解解决方案。
我在相应视图的字段中添加了一个属性context="{'intersect': True}",以便在其他上下文中进行故障保护。
domain 仍然存在并在must_contain_programs 中使用。

@api.model
def name_search(self, name='', args=None, operator='ilike', limit=100):
    is_intersect_context = self._context.get('intersect')
    must_contain_programs = args[0][2]
    if(is_intersect_context and len(must_contain_programs) > 1):
        all_departments = self.env['hr.department'].search([])
        filtered_departments = []
        for department in all_departments:
            if all(program_id in department.programs.ids for program_id in must_contain_programs):
                filtered_departments.append(department)
        if len(filtered_departments) > 0:
            intersect_res = []
            for filtered_department in filtered_departments:
                intersect_res.append((filtered_department.id, filtered_department.name))
            intersect_res.sort(key=lambda tuple: tuple[0])
            if name != '':
                res = list(filter(lambda tuple: name.upper() in tuple[1].upper(), intersect_res))
            else:
                res = intersect_res
    else:
        res = super(HrDepartment, self).name_search(name, args, operator, limit)
    return res

【讨论】:

  • 是否可以覆盖自定义添加过滤器的apply方法?我想要自定义添加过滤器的参数,对于特定字段我想要过滤更多并返回。
猜你喜欢
  • 2013-05-04
  • 2020-04-17
  • 2021-10-30
  • 2013-09-18
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 2022-08-14
  • 2016-02-23
相关资源
最近更新 更多