Compute và Onchange
Các mô hình kinh doanh và mối quan hệ giữa chúng là những thành phần quan trọng của bất kỳ mô-đun Odoo nào. Mỗi mô hình kinh doanh bao gồm các lĩnh vực, có thể chia thành hai loại: trường Cơ bản và trường Quan hệ. Các trường cơ bản được sử dụng để biểu diễn các giá trị đơn giản như số hoặc văn bản và các trường Quan hệ được sử dụng để biểu diễn quan hệ giữa các mô hình.
Trong một số khía cạnh nhất định, chúng ta cũng có thể muốn liên kết giữa các trường hoặc đôi khi giá trị của một trường cụ thể có thể liên quan đến một trường khác hoặc nhiều hơn một trường. Trong những trường hợp như vậy, chúng ta có thể sử dụng khái niệm trường Compute và trường Onchange trong Odoo.
Ở đây trong bài viết này, chúng ta sẽ thảo luận về sự khác biệt giữa các trường Compute và Onchange trong Odoo.
Compute
Trường Compute có thể được định nghĩa đơn giản là trường mà giá trị được tính bằng một phương thức(method) thay vì đọc trực tiếp từ người dùng. Đây có thể là trường Cơ bản hoặc trường Quan hệ với thuộc tính bổ sung "compute" trong định nghĩa trường. Hãy xem xét một mô hình kinh doanh để quản lý Đơn đặt hàng cho thuê, trong đó tổng số tiền thuê được tính từ thời lượng và giá cho thời hạn đơn vị. Mục đích là chúng ta hãy định nghĩa một trường Monetary ‘total_rent’ như trong đoạn mã sau đây và là trường được compute trong đó giá trị của trường này được tính bằng cách sử dụng giá trị của một hoặc nhiều trường khác.
Trong mô-đun Cho thuê phương tiện mà chúng tôi đã xác định, có một trường tính toán total_rent trong đó giá trị được tính bằng cách nhân tỷ lệ hàng giờ và tổng số giờ. Chúng ta biết rằng trong case của các trường khác, các giá trị được lưu trữ trong cơ sở dữ liệu và được truy xuất trực tiếp từ đó. Nhưng giá trị của một trường được compute không được lưu trữ trong cơ sở dữ liệu. Chúng được tính bằng phương thức được chỉ định trong mô hình theo việc gọi. Do đó, phương thức compute trong một mô hình sẽ được thực thi mỗi lần cập nhật. Hơn nữa, mọi phương thức compute phải gán một giá trị cho trường compute, nếu không, hệ thống sẽ gặp lỗi.
Depends
Hàm Depends depends (* args) trả về decorator chỉ định các trường phụ thuộc của một hàm “compute”. Đối với depends() decorator, mỗi đối số phải là một chuỗi và cũng có thể chuyển một phương thức đơn làm đối số. Trong những trường hợp như vậy, các phụ thuộc được thiết lập bằng cách gọi phương thức đã xác định. Thông thường, giá trị của các trường được tính phụ thuộc vào các trường khác, do đó, tốt hơn là nên đưa các thành phần phụ thuộc vào phương thức compute. ORM mong đợi nhà phát triển chỉ định những phụ thuộc đó với decorator depend () vào phương thức. Các phần phụ thuộc đã cho được ORM sử dụng để kích hoạt phương thức compute bất cứ khi nào có bất kỳ thay đổi nào xảy ra trong các trường phụ thuộc.
Chúng ta cũng có thể sử dụng trường thông qua một trường nối như một trường phụ thuộc.
@api.depends (‘move_id.state’)
Trường nối được sử dụng có thể là Many2many, One2many hoặc Many2one và cho tất cả các loại trường quan hệ.
Đây là một ví dụ để đặt đối số dưới dạng một hàm.
Đến đây chúng ta đã rõ về Trường Compute, bây giờ chúng ta hãy chuyển sang hiểu các trường Onchange trong Odoo là gì trong phần tiếp theo của bài viết.
Onchange
onchange (* args) trả về decorator để triển khai một phương thức “onchange” cho các trường nhất định. Nếu một đối số có tên có dấu chấm (ví dụ: partner_id.name) được đưa ra, thì nó sẽ bị decorator bỏ qua. Hơn nữa, onchange () trả về một tập hợp các bản ghi tạm, do đó, tốt hơn hết là bạn nên tránh gọi bất kỳ một trong các phương thức CRUD (create (), read (), write (), unlink ()).
Cơ chế onchange trong Odoo cho phép tính năng sửa đổi hoặc cập nhật giá trị của một trường nếu bất kỳ cập nhật nào được thực hiện trên các trường khác. Hơn nữa, sự thay đổi sẽ được kích hoạt khi một trong các trường nhất định được sửa đổi trong dạng form view, tức là chúng chỉ được kích hoạt trong dạng form view. Trong ví dụ đã cho, Tham chiếu cho đơn đặt hàng cho thuê đạt được từ một phương pháp. Phương thức onchange sẽ trigger trường ‘vehicle_id’
Các phương thức onchange không được tự động kích hoạt khi tạo bản ghi bằng mã hoặc theo chương trình. Cũng cần nhớ rằng mỗi đối số cho trình trang trí phải là một giá trị trường duy nhất. Như vậy là chúng ta đã hiểu sơ bộ về trường Compute và Onchange bây giờ chúng ta hãy chuyển sang tìm hiểu sự khác biệt giữa chúng trong phần tiếp theo của bài viết.
Sự khác nhau giữa Compute và Onchange
Bây giờ chúng ta hãy xem sự khác biệt giữa Compute và Onchange là gì.
1. Các phương thức compute là riêng theo convention.
2. Mặt khác, giá trị của trường được computed không được lưu trữ trong cơ sở dữ liệu nhưng nó sẽ được compute mỗi khi trường được truy cập. Do đó, chúng ta có thể nói rằng phương thức tính toán được thực thi mỗi khi chúng ta cố gắng truy cập vào trường. Hơn nữa, việc mở tree view hoặc form view bao gồm trường được tính toán có thể được coi là một ví dụ. Mặt khác, cơ chế ‘onchange’ cung cấp một cách để giao diện máy phía client cập nhật form mà không cần lưu bất kỳ thứ gì vào cơ sở dữ liệu bất cứ khi nào người dùng điền hoặc thay đổi một giá trị trường và Onchange chỉ được kích hoạt khi một trong các thuộc tính đã cho thay đổi giá trị của nó.
3. Mọi phương thức compute nên gán một giá trị cho trường được compute, do đó, cần đảm bảo rằng phương thức compute sẽ gán một giá trị cho trường theo mọi điều kiện. Tuy nhiên, có thể xác định một phương thức onchange ngoài việc gán giá trị cho một trường dựa trên một quy trình thay đổi giá trị trường khác. Chức năng Onchange cũng có thể trả về các thông báo lỗi không chặn.
4. Các phương thức compute được kích hoạt bất cứ khi nào trường được compute được truy cập, cho dù ở dạng xem hay bằng mã. Đó là chúng được kích hoạt bên ngoài ngữ cảnh của dạng form view, do đó, tốt hơn là bạn nên ưu tiên các trường được compute hơn. Các phương thức onchange không được tự động kích hoạt khi tạo bản ghi thông qua mã hoặc theo chương trình. Do đó, không phải là một ý kiến hay khi sử dụng một khái niệm onchange để thêm logic nghiệp vụ vào mô hình của bạn.
5. Các trường được compute sẽ dễ debug hơn vì rất dễ lấy hàm tương ứng từ nơi giá trị của trường thực sự được đặt. Phương thức compute có thể được tìm thấy từ bước khai báo trường. Tuy nhiên, trong trường hợp onchange, người ta sẽ khó tìm ra giá trị chính xác đến từ đâu vì một số phương thức onchange có thể đặt các trường giống nhau để trigger. Vì phương thức compute thực thi khi truy cập trường được compute nên có khả năng nhận được nhiều bản ghi trong self ().Vì vậy, điều quan trọng cần nhớ là người ta phải sử dụng vòng lặp trong self () để tránh lỗi singleton. Vì phương thức onchange chỉ được kích hoạt khi thay đổi các giá trị nên không bắt buộc phải lặp qua self vì chúng ta sẽ nhận được một bản ghi duy nhất trong self () để chuyển một phương thức duy nhất làm đối số.
6. Các trường dùng ở decorator của phương thức onchange phải là các trường đơn không phải trường quan hệ hoặc trường nối nếu không sẽ bị bỏ qua và bạn không nên sử dụng bất kỳ phương thức CRUD nào trong một hàm onchange vì nó trả về một tập hợp các bản ghi tạm.
7. Tuyệt đối không được sử dụng thuộc tính readonly= True khi đã xác định sử dụng phương thức onchange để thực hiện logic.