【问题标题】:Odoo 15 Search non-stored compute value that depends on search_count of many2one fieldOdoo 15 搜索依赖于 many2one 字段的 search_count 的非存储计算值
【发布时间】:2022-12-03 01:17:43
【问题描述】:

我正在尝试显示具有多个物料清单的某些产品的视图。我创建了一个计算字段,用于标记应显示哪些记录。我正在尝试创建一个搜索功能,以便可以将感兴趣的记录显示为过滤器,但我在创建该功能时遇到了问题。

目前正在尝试将感兴趣的 record.id 附加到列表中并在搜索域中返回列表,但这不起作用。任何帮助将非常感激。请参阅下面的代码并提前致谢!

我尝试了以下代码,但它返回一个空数据列表。我认为我获取当前记录的 ID 并将其附加到返回列表的方式有问题。

class products_ppa_bom_check(models.Model):
    _inherit = ['product.template']
    ppa_multi_bom = fields.Selection([
        ('true', 'True'),
        ('false', 'False'),
        ('na', 'Not Applicable')], 
        string="PPA Multi BOM Check", compute='_compute_ppa_multi_bom',
        search='_search_ppa_multi_bom')
    
    def _compute_ppa_multi_bom(self):
        for record in self:
            count = record.env['mrp.bom'].search_count(['|', ('product_tmpl_id', '=', record.id), ('byproduct_ids.product_id.product_tmpl_id', '=', record.id)])
            if (count > 1) and ('PPA' in str(record.default_code)):
                record.ppa_multi_bom = 'true'
            elif (count == 1) and ('PPA' in str(record.default_code)):
                record.ppa_multi_bom = 'false'
            else: record.ppa_multi_bom = 'na'
  
    def _search_ppa_multi_bom(self, operator, value):
        ids = []
        for record in self:
            count = record.env['mrp.bom'].search_count(['|', ('product_tmpl_id', '=', record.id), ('byproduct_ids.product_id.product_tmpl_id', '=', record.id)])
            if (count > 1) and ('PPA' in str(record.default_code)):
                ids = ids.append(record.id)
        return[('id', 'in', ids)]

【问题讨论】:

    标签: odoo odoo-15


    【解决方案1】:

    如果您想在带有 = 运算符的产品中使用过滤器,您可以使用我已经测试过的以下代码:

    您可以使用 bom_count 字段而不是使用 search_count 方法

    from odoo import api, fields, models, _
    
    
    class products_ppa_bom_check(models.Model):
        _inherit = ['product.template']
    
        ppa_multi_bom = fields.Selection([
            ('true', 'True'),
            ('false', 'False'),
            ('na', 'Not Applicable')],
            string="PPA Multi BOM Check", compute='_compute_ppa_multi_bom',
            search='_search_ppa_multi_bom')
    
        def _compute_ppa_multi_bom(self):
            for record in self:
                if (record.bom_count > 1) and ('PPA' in str(record.default_code)):
                    record.ppa_multi_bom = 'true'
                elif (record.bom_count == 1) and ('PPA' in str(record.default_code)):
                    record.ppa_multi_bom = 'false'
                else:
                    record.ppa_multi_bom = 'na'
    
        def _search_ppa_multi_bom(self, operator, value):
            true_ids = self.env['product.template'].search([]).filtered(
                lambda x: x.bom_count > 1 and 'PPA' in str(x.default_code)).ids
            false_ids = self.env['product.template'].search([]).filtered(
                lambda x: x.bom_count == 1 and x.default_code and 'PPA' in x.default_code).ids
            if value == 'true':
                ids = true_ids
            elif value == 'false':
                ids = false_ids
            else:
                all_ids = self.env['product.template'].search([]).ids
                ids = list(set(all_ids) - set(true_ids + false_ids))
            return [('id', 'in', ids)]
    

    将过滤器添加到搜索视图:

     <record id="product_template_search_view_inherit_bom" model="ir.ui.view">
                <field name="name">product.template.search.inherit.bom</field>
                <field name="model">product.template</field>
                <field name="inherit_id" ref="product.product_template_search_view"/>
                <field name="arch" type="xml">
                    <xpath expr="//filter[@name='consumable']" position="after">
                        <separator/>
                        <filter string="Multi BOM" name="ppa_multi_bom" domain="[('ppa_multi_bom', '=', 'true')]"/>
                        <filter string="One BOM" name="ppa_one_bom" domain="[('ppa_multi_bom', '=', 'false')]"/>
                        <filter string="NA BOM" name="ppa_na_bom" domain="[('ppa_multi_bom', '=', 'na')]"/>
                    </xpath>
                </field>
            </record>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多