环境
我创建了两个TransientModel
(名为lots.manager
和product.lot.available
),它们之间存在One2many
关系(很多经理会有几个可用的批次)。
我的目的是显示可用批次的列表,用户将能够选择他想要使用的批次以及每个批次的数量。因此,product.lot.available
包含字段lot_id
(选择一个批次),selected
(一个Boolean
表示是否使用该批次),qty
(a Float
表示每批次使用的数量。)
另一方面,在lots.manager
模型中,我有一个名为total_qty_selected
的计算字段,用于计算qty
所有可用批次的selected
的总和字段 True 。
CODE
class LotsManager(models.TransientModel):
_name = 'lots.manager'
@api.multi
@api.depends('product_lots_available', 'product_lots_available.selected',
'product_lots_available.qty')
def _compute_total_qty_selected(self):
for manager in self:
total = 0
for lot in manager.product_lots_available:
if lot.selected is True:
total += lot.qty
manager.total_qty_selected = total
move_id = fields.Many2one(
comodel_name='stock.move',
string='Stock move',
required=True,
select=True,
readonly=True,
)
product_id = fields.Many2one(
comodel_name='product.product',
related='move_id.product_id',
string='Product',
)
product_lots_available = fields.One2many(
comodel_name='product.lot.available',
inverse_name='manager_id',
string='Available lots',
)
total_qty_selected = fields.Float(
compute='_compute_total_qty_selected',
string='Total quantity selected',
)
class ProductLotAvailable(models.TransientModel):
_name = 'product.lot.available'
manager_id = fields.Many2one(
comodel_name='lots.manager',
string='Lots Manager',
)
lot_id = fields.Many2one(
comodel_name='stock.production.lot',
string='Lot',
readonly=True,
)
selected = fields.Boolean(
string='Selected',
default=False,
)
qty = fields.Float(
string='Quantity',
default=0.00,
)
@api.onchange('selected')
def onchange_selected(self):
if self.selected is True:
_logger.info(self.manager_id.product_id.name)
_logger.info(self.manager_id.total_qty_selected)
问题
计算后的字段total_qty_selected
计算得很好(我在视图中显示它并且效果很好)但是,当我尝试从product.lot.available
读取它时,我总是得到0.例如,{上面的_logger
函数中的{1}}行显示了产品的名称,但onchange
返回0,而不是在那一刻我可以在表单中读取2.00或任何值与0不同。
我需要在onchange函数中做一些正确的值。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
在计算字段中使用store=True
。请尝试下面的代码
class LotsManager(models.TransientModel):
_name = 'lots.manager'
total_qty_selected = fields.Float(
compute='_compute_total_qty_selected',
string='Total quantity selected', store=True
)
答案 1 :(得分:0)
最后,我设法用一种可怕的解决方法解决了这个问题。但它运作良好。
我将以下字段添加到lots.manager
模型中:
total_qty_selected_copy = fields.Float(
string='Total quantity selected (copy)',
default=False,
)
每次原始字段都会更改此字段,添加以下代码:
@api.one
@api.onchange('total_qty_selected')
def onchange_selected(self):
self.total_qty_selected_copy = self.total_qty_selected
显然,我必须将total_qty_selected_copy
添加到XML视图中,并使其不可见。
经过这些修改后,我可以通过这个新字段从product.lot.available
模型获得我需要的值:
@api.onchange('selected')
def onchange_selected(self):
if self.selected is True:
_logger.info(self.manager_id.product_id.name)
_logger.info(self.manager_id.total_qty_selected_copy)