首先,了解 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 時,數據將保存到數據庫。