x

Cách thêm bộ lọc tìm kiếm cho các trường tính toán trong Odoo 17

Trước tiên, chúng ta phải hiểu mục đích của computed fields của Odoo. computed fields được sử dụng khi chúng ta cần lấy các giá trị computed hoặc được tính toán từ các trường khác. tức là, các hàm có thể được sử dụng để tính toán các giá trị trường thay vì đọc các giá trị từ cơ sở dữ liệu. Khi chúng ta muốn tìm tổng số tiền của một sản phẩm, chúng ta có thể nhân giá sản phẩm với tổng số sản phẩm, đây là một ví dụ về computed field đang hoạt động. Tức là Tổng = Giá sản phẩm x Số lượng sản phẩm.

Theo mặc định, các trường tính toán trong Odoo không được lưu trong cơ sở dữ liệu.

Do đó, đôi khi chúng ta có thể cần tìm kiếm hoặc lọc bằng các trường được tính toán này.

Blog này chủ yếu sẽ đề cập đến Cách thêm chức năng tìm kiếm cho trường tính toán không được lưu trữ trong Odoo. Các trường tính toán trong Odoo có thể được lưu trữ theo hai cách khác nhau. Bằng cách thêm store=True, chúng ta có thể lưu trữ trường. Sử dụng chức năng tìm kiếm và đặt nó trên trường là một kỹ thuật bổ sung.

Vì vậy, chúng tôi muốn lọc theo đợt bán đã hết hạn. Chúng tôi đã bao gồm một trường Ngày gọi là expired_date và một trường Boolean gọi là is_expired cho mục đích đó. Như được minh họa bằng mã được cung cấp bên dưới.

is_expired = fields.Boolean(string="Đã hết hạn", compute='_compute_is_expired',store=True)


Ở đây, chúng tôi đã bao gồm một hàm tìm kiếm ngoài trường tính toán trong trường is_expired. Các hàm tính toán và tìm kiếm được định nghĩa trong mã Python được cung cấp bên dưới. Ba đối số phải được truyền vào hàm tìm kiếm: self, toán tử và giá trị.

is_expired = fields.Boolean(string="Đã hết hạn", compute='_compute_is_expired',search = '_search_is_expired') 

def _search_is_expired(self, toán tử, giá trị): 

today = fields.Date.today() 

records = self.env['sale.order'].search([('validity_date', '<', today)]) 

return [('id', 'in', records.ids)]​


Trong XML, chúng ta có bộ lọc như bạn có thể thấy trong đoạn mã bên dưới và cũng xác định search_view_id.

<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="Đã hết hạn" domain="[('is_expired', '=', True)]"/> 

</xpath> 

</field> 

</record>​


Đây là cách đưa bộ lọc tìm kiếm vào Odoo cho các trường được tính toán. Chúng ta sẽ viết mã để tính giá trị trong hàm tính toán. Ngoài ra, hàm tìm kiếm chỉ định những gì sẽ được trả về. Khi store=True được chọn, dữ liệu sẽ được lưu vào cơ sở dữ liệu.


Tham khảo: cybrosys.com