当我使用来自其他模型的字段时,如何使用 "store=True" 使计算字段工作?
How to make work a computed field with "store=True" when I am using fields from other model?
我在联系人树视图中有 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
理论
的 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
如您所见,您需要添加依赖项来触发计算方法并更新值。在这种情况下,字段 value
和 tax
位于同一模型中。因此,如果您使用来自同一模型或与该模型相关的字段,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
另一种解决方案:
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(comodel_name='pos.order',
inverse_name='partner_id',
string='Pos Ordres')
@api.one
@api.depends('pos_order_ids')
def _compute_pos_order_total(self):
Order_id = self.env['pos.order'].search([('partner_id', '=', self.id)])
for Order in Order_id:
total = 0.0
total += Order.amount_total
self.pos_order_total = total
我在联系人树视图中有 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
理论
的 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
如您所见,您需要添加依赖项来触发计算方法并更新值。在这种情况下,字段 value
和 tax
位于同一模型中。因此,如果您使用来自同一模型或与该模型相关的字段,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
另一种解决方案:
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(comodel_name='pos.order',
inverse_name='partner_id',
string='Pos Ordres')
@api.one
@api.depends('pos_order_ids')
def _compute_pos_order_total(self):
Order_id = self.env['pos.order'].search([('partner_id', '=', self.id)])
for Order in Order_id:
total = 0.0
total += Order.amount_total
self.pos_order_total = total