首先,了解 Odoo 使用计算字段的原因很重要。当我们需要从其他字段获取计算值或计算值时,就会使用计算字段。换句话说,不是从数据库中检索值,而是可以使用函数计算字段的值。计算字段的一个例子是产品总金额,即通过将产品价格乘以产品总数得出。即,总额等于产品价格乘以产品数量。
在Odoo 16中,计算字段默认不保存在数据库中。因此,在某些情况下我们需要使用这些计算字段进行搜索或过滤。
主要介绍如何在 Odoo 16 中为非存储计算字段添加搜索功能来实现这一点。
在 Odoo 中,计算字段可以以两种不同的方式存储。通过设置 store=True,我们可以创建商店字段。此外,您可以通过在字段上设置来使用搜索功能。
我将使用销售订单中的 is_expired 字段作为示例来说明这一点。
我们没有按 is_expired 字段进行过滤的选项。让我们通过继承销售订单来添加它
class SaleOrder(models.Model):_inherit = "sale.order"is_expired = fields.Boolean(string="Is Expired", compute='_compute_is_expired',store=True)
在这里,我们为字段添加了字段属性 store=True。(注意:如果维护 store=True,则只有在依赖字段的值发生变化时,计算函数才会运行)。
使用计算字段进行搜索的第二种方法是向计算字段添加搜索功能,如下面提供的代码所示。
is_expired = fields.Boolean(string="Is Expired", compute='_compute_is_expired',search = '_search_is_expired')
def _search_is_expired(self, operator, value):today = fields.Date.today()records = self.env['sale.order'].search([('validity_date', '<', today)])return [('id', 'in', records.ids)]
我们需要继承 XML 中的搜索视图并向其中添加过滤器。
<record id="is_expired_view_search_inherit_quotation" model="ir.ui.view"><field name="name">is.expired.search.view</field><field name="model">sale.order</field><field name="inherit_id" ref="sale.view_sales_order_filter"/><field name="mode">primary</field><field name="priority">32</field><field name="arch" type="xml"><xpath expr="//filter[@name='my_sale_orders_filter']" position="after"><filter name="is_expired" string="Is Expired" domain="[('is_expired', '=', True)]"/></xpath>
</field>
</record>
同样,我们不仅可以为布尔字段添加搜索功能,还可以为其他类别字段的计算字段添加搜索功能。
这是如何在 Odoo 中包含计算字段的搜索过滤器。我们将编写代码来计算计算函数中的值。此外,搜索函数指定应返回的内容。当选择 store=True 时,数据将保存到数据库。