Odoo 中的Mixin类的用法

假设有一个需求希望在订单上选择客户时显示该客户的可用信用额度。很显然我们可以继承sale.order对象,增加可用信用额度的计算字段:

class SaleOrder(models.Model):
    _inherit = 'sale.order'

     available_credit = fields.Float(string=u'可用信用额度', compute='_get_available_credit')

     @api.depends('partner_id')
     def _get_available_credit(self):
         ....

这个需求很简单。但是,如果对销售发票也有同样的需求呢?我们当然可以把上面的代码拷贝到account.invoice的继承对象中。

可是过一段时间,客户又希望当信用额度不足时有警告提示。这时我们又要在销售订单和销售发票上添加相同的代码。我们可能会碰到越来 越多这种在不同类中包含的相同类属性和方法的情况。编码的DRY(Don’t Repeat Yourself)原则告诉我们一定有更好的方法。这个方法就是在 Odoo中使用Mixin类。比如上面的代码我们可以写在一个Mixin类中:

class CreditControlMixin(models.AbstractModel):
    _name = 'sale.credit.control.mixin'

     available_credit = fields.Float(string=u'可用信用额度', compute='_get_available_credit')

     @api.depends('partner_id')
     def _get_available_credit(self):
         ....

然后在sale.orderaccount.invoice继承类对象中用_inherit继承即可,比如:

class SaleOrder(models.Model):
    _inherit = ['sale.order', 'sale.credit.control.mixin']

以及

class AccountInvoice(models.Model):
    _inherit = ['account.invoice', 'sale.credit.control.mixin']

这样如果我们需要对信用控制做修改时,比如设置可用额度的数字精度,我们只需要在Mixin 类一个地方修改就可以了。