Trong Python, mixin đề cập đến như một lớp cung cấp các phương thức có thể được sử dụng lại.Tính năng này cũng có thể được sử dụng trong nền tảng Odoo. Bài viết này chúng ta sẽ thảo luận về cách sử dụng các class mixin trong Odoo 15.
Dưới đây mình có một ví dụ về 1 module trong đó có 3 đối tượng tương ứng với 3 model Teacher, Students, Parent. Trong đó mỗi đối tượng mình sẽ có 1 trường để lưu trữ ngày sinh và 1 trường lưu trữ tuổi được tự động tính từ trường ngày sinh. T
Trong trường hợp này, phương thức tính tuổi từ ngày sinh được viết ở 3 chỗ tương ứng với 3 model, vì vậy ở đây chúng ta sẽ cần đến mixin để có thể tái sử dụng lại và không phải viết cùng 1 đoạn code ở nhiều chỗ khác nhau.
Student Model
class Student(models.Model):
_name = "student.student"
_description = "Student"
name = fields.Char(string="Name", required=True)
partner_id = fields.Many2one('res.partner', string="Partner")
phone = fields.Char(string="Phone Number")
email = fields.Char(string="Email", required=True)
status = fields.Char(string="Status")
date = fields.Date(string="Date", default=fields.Date.today())
total_grade = fields.Float(string="Total Grade")
dob = fields.Date(string="DOB")
age = fields.Integer(string="Age", compute='_compute_age')
Parent Model
class Parent(models.Model):
_name = "student.parent"
_description = "Parent"
name = fields.Char(string="Name", required=True)
phone = fields.Char(string="Phone Number")
email = fields.Char(string="Email")
partner_id = fields.Many2one('res.partner', string="Partner", required=True)
date = fields.Date(string="Date", default=fields.Date.today())
student_ids = fields.Many2many('student.student', string="Students")
dob = fields.Date(string="DOB")
age = fields.Integer(string="Age", compute='_compute_age')
Teacher Model
class Teacher(models.Model):
_name = "teacher.teacher"
_description = "Teacher"
name = fields.Char(string="Name", required=True)
phone = fields.Char(string="Phone Number")
email = fields.Char(string="Email")
partner_id = fields.Many2one('res.partner', string="Partner", required=True)
date = fields.Date(string="Date", default=fields.Date.today())
student_ids = fields.Many2many('student.student', string="Students")
dob = fields.Date(string="DOB")
age = fields.Integer(string="Age", compute='_compute_age')
Bây giờ chúng ta sẽ tạo ra 1 class mixin để viết phương thức tính tuổi từ ngày sinh như sau:
Mixin Class
from odoo import fields
from dateutil.relativedelta import relativedelta
import logging
_logger = logging.getLogger(__name__)
class GetAgeMixin:
def get_age_from_dob(self, dob):
"""
:return: Returns age.
"""
age = 0
today = fields.Date.today()
if dob:
age = relativedelta(today, dob).years
return age
Chúng ta sẽ kế thừa lại lớp Mixin này như sau:
class Student(models.Model, GetAgeMixin):
_name = "student.student"
_description = "Student"
Và chúng ta sẽ viết hàm compute như sau:
@api.depends('dob')
def _compute_age(self):
for rec in self:
rec.age = self.get_age_from_dob(rec.dob)
Tuy rằng ở ví dụ này, logic ở trong mixin không phức tạp, tuy nhiên với trường hợp thực tế đôi khi logic phức tạp khiến đoạn code xử lý rất dài, việc áp dụng mixin vào sẽ khiến chúng ta có cảm nhận rõ rệt hữu ích của nó mang lại