python-3.x - Odoo 11:在 sale.order.line 模型中创建计算字段时出现问题
问题描述
我想将每个产品的 bom_id 放在sale.order.line模型中,为此,我使用计算字段来获取 bom id (mrp.bom)。我需要它用于指定的开发,目标是在生产之前根据公司的计算显示消耗的材料。这是代码:
bom_id = fields.Integer(
string='Bom ID',
compute='_get_bom_id'
)
@api.multi
def _get_bom_id(self):
bom_obj = self.env['mrp.bom']
for record in self:
bom_obj_id = bom_obj.search([('product_id', '=', record.product_id.id)])
if bom_obj_id:
record.bom_id = bom_obj_id.id
else:
record.bom_id = 0
问题是该字段不是在 sale.order.line 模型中创建的,但是如果我删除了计算参数,它就可以工作。我已经更新了模块,签入 pgadmin,......我知道问题与代码有关,但不知道在哪里。你能帮助我吗?谢谢
解决方案
您创建的字段类型错误,它应该是Many2one而不是Integer:
bom_id = fields.Many2one(
comodel_name='mrp.bom',
string='Bom ID',
compute='_get_bom_id'
)
你也忘记了api.depends
装饰器。在您的情况下,每次字段product_id
更改时都应重新计算该值。
此外,计算字段总是False
在执行其计算方法之前进行赋值,因此如果在您的计算方法中工作流没有为字段赋值,它仍然是 values False
,这意味着行喜欢record.bom_id = 0
或record.bom_id = False
无用。
@api.multi
@api.depends('product_id')
def _get_bom_id(self):
bom_obj = self.env['mrp.bom']
for record in self:
bom_obj_id = bom_obj.search([('product_id', '=', record.product_id.id)])
if bom_obj_id:
record.bom_id = bom_obj_id.id
推荐阅读
- angular - 使用 ngTemplateOutlet 构建 Angular 动态 DevExtreme 表单,不能将嵌套项放在父级中
- android - 在android camerax(相机2)中禁用自动对焦
- php - laravel 使用 groupBy 子句获取最新记录
- javascript - 连续去抖流功能
- machine-learning - 高度不平衡数据集的 PU bagging 中的 Max_samples 超参数
- c# - 并非所有崩溃都得到处理“应用程序已停止工作”
- vue.js - 在 Vue 中动态地将元素添加到可排序的 LI
- sql - 寻找 SQL 中的性能改进
- java - 没有 Schema 的 JSON 和 Avro 反序列化
- .net-core - 如何修复错误[System.DllNotFoundException:无法加载共享库'gdi32.dll'或其依赖项之一]?