首页 > 解决方案 > 当我使用来自其他模型的字段时,如何使用“store = True”使计算字段工作?

问题描述

pos_order_total在联系人树视图中有该字段。如果 是完美计算的store=False,但store=True如果我做了一些 POS 订单则没有计算。那么我怎样才能使这个工作store=True

from odoo import api, fields, models

class ResPartner(models.Model):
    _inherit = 'res.partner'

    pos_order_total = fields.Monetary(
        string='POS Order Total',
        compute='_compute_pos_order_total',
        store=True)

    def _compute_pos_order_total(self):
        Order = self.env['pos.order']
        for partner in self:
            total = 0.0
            domain = [('partner_id', '=', partner.id)]
            for o in Order.search(domain):
                total += o.amount_total
            partner.pos_order_total = total

标签: pythonpython-2.7odoo-8odooodoo-10

解决方案


理论

查看计算字段的 Odoo 文档

total = fields.Float(compute='_compute_total')

@api.multi
@api.depends('value', 'tax')
def _compute_total(self):
    for record in self:
        record.total = record.value + record.value * record.tax

如您所见,您需要添加依赖项以触发计算方法并更新值。在这种情况下,字段valuetax在同一模型中。因此,如果您使用的是来自同一模型或与该模型相关的字段,那么store=True它将运行良好。因此,如果可能,您应该通过关系连接字段。

解决方案

在您的情况下,您需要创建一个one2many字段来关联表。检查以下代码是否适合您:

class ResPartner(models.Model):
    _inherit = 'res.partner'

    pos_order_total = fields.Float(
        string='POS Order Total',
        compute='_compute_pos_order_total',
        store=True
    )

    pos_order_ids = fields.One2many(
        string=u'POS Orders',
        comodel_name='pos.order',
        inverse_name='partner_id',
    )

    @api.multi
    @api.depends('pos_order_ids.amount_total')
    def _compute_pos_order_total(self):
        for partner in self:
            total = 0.0
            for order in partner.pos_order_ids:
                total += order.amount_total
            partner.pos_order_total = total

推荐阅读