我在制造领料操作中添加了批处理数量字段。它完美地反射(reflect)了相对于位置的手数。现在的问题是我不想展示没有产品的批处理,即 0 数量。我如何实现这一点?
这是模型代码(stock_move_line.py):
class StockMoveLine(models.Model):
_name = "stock.move.line"
_description = "Product Moves (Stock Move Line)"
_rec_name = "product_id"
_order = "result_package_id desc, id"
lot_id = fields.Many2one('stock.production.lot', 'Lot/Serial Number123')
x_lot_qty = fields.Float(compute="fetch_lot_wrt_location",
name="Lot Quantity",
store=True,
readonly=True,
digits=(12,3))
@api.onchange('lot_id','location_id')
def fetch_lot_wrt_location(self):
self.x_lot_qty = 0.0
for row in self:
quants = self.env['stock.quant'].search([('lot_id.id','=',row.lot_id.id)])
for quant in quants:
if row.location_id.display_name == quant.location_id.display_name:
row.x_lot_qty = quant.quantity
这里是 View (stock_move_views.xml):
<field name="lot_id"
attrs="{'readonly': ['&', ('package_level_id', '!=', False), ('parent.picking_type_entire_packs', '=', True)]}"
invisible="not context.get('show_lots_m2o')"
domain="[('product_id', '=', parent.product_id)]"
groups="stock.group_production_lot"
context="{'default_product_id': parent.product_id, 'active_picking_id': picking_id}"/>
<field name="x_lot_qty"
attrs="{'readonly': ['&', ('package_level_id', '!=', False), ('parent.picking_type_entire_packs', '=', True)]}"
invisible="not context.get('show_lots_m2o')"
domain="[('product_id', '=', parent.product_id)]"
groups="stock.group_production_lot"
context="{'default_product_id': parent.product_id, 'active_picking_id': picking_id}"/>
我确实通过域属性应用了过滤器,但它不起作用。如何限制数量为0的批号。
更新: 我尝试了以下解决方案: 我创建了一个新的动态选择字段并尝试填充相对于位置不为空的地段,下面是代码:
@api.onchange('location_id')
def _fetch_non_empty_lots(self):
lots = []
for row in self:
quants = self.env['stock.quant'].search([('location_id.id','=',row.location_id.id), ('product_id.id', '=', row.product_id.id), ('quantity', '>', 0)])
for quant in quants:
lots.append(quant)
return lots
x_lot_id = fields.Selection(selection="_fetch_non_empty_lots", name="Non Empty Lots")
但是现在当我选择一个新的位置时,我得到以下错误:
Odoo Server Error
Traceback (most recent call last):
File "C:\virtual_odoo12\Scripts\odoo\http.py", line 656, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "C:\virtual_odoo12\Scripts\odoo\http.py", line 314, in _handle_exception
raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
File "C:\virtual_odoo12\Scripts\odoo\tools\pycompat.py", line 87, in reraise
raise value
File "C:\virtual_odoo12\Scripts\odoo\http.py", line 698, in dispatch
result = self._call_function(**self.params)
File "C:\virtual_odoo12\Scripts\odoo\http.py", line 346, in _call_function
return checked_call(self.db, *args, **kwargs)
File "C:\virtual_odoo12\Scripts\odoo\service\model.py", line 97, in wrapper
return f(dbname, *args, **kwargs)
File "C:\virtual_odoo12\Scripts\odoo\http.py", line 339, in checked_call
result = self.endpoint(*a, **kw)
File "C:\virtual_odoo12\Scripts\odoo\http.py", line 941, in __call__
return self.method(*args, **kw)
File "C:\virtual_odoo12\Scripts\odoo\http.py", line 519, in response_wrap
response = f(*args, **kw)
File "c:\virtual_odoo12\scripts\addons\web\controllers\main.py", line 962, in call_kw
return self._call_kw(model, method, args, kwargs)
File "c:\virtual_odoo12\scripts\addons\web\controllers\main.py", line 954, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "C:\virtual_odoo12\Scripts\odoo\api.py", line 759, in call_kw
return _call_kw_multi(method, model, args, kwargs)
File "C:\virtual_odoo12\Scripts\odoo\api.py", line 746, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "C:\virtual_odoo12\Scripts\odoo\models.py", line 5524, in onchange
record._onchange_eval(name, field_onchange[name], result)
File "C:\virtual_odoo12\Scripts\odoo\models.py", line 5369, in _onchange_eval
process(method_res)
File "C:\virtual_odoo12\Scripts\odoo\models.py", line 5355, in process
if res.get('value'):
AttributeError: 'list' object has no attribute 'get'
更新 2: 我没有修改现有的下拉列表,而是创建了一个动态下拉列表。选择位置后,下拉列表中会填充数量大于 0 的批号。但是,我面临一个基本问题/错误:
AttributeError: 'list' object has no attribute 'get'
这是模型选择字段和填充它的代码:
@api.onchange('location_id')
def _fetch_non_empty_lots(self):
quants = self.env['stock.quant'].search([('location_id.id','=',self.location_id.id),
('product_id.id', '=', self.product_id.id),
('quantity', '>', 0)])
return {str(quant.lot_id.id) :str.title(quant.lot_id.display_name) for quant in quants}
## declare field
x_lot_id = fields.Selection(selection="_fetch_non_empty_lots", name="Non Empty Lots")
当列表为空时,没有错误。当有非空地段时,我得到了错误。我需要一些帮助。
最佳答案
Odoo在库存生产批处理模型中定义了一个产品数量字段,您可以在域中使用该字段来过滤批处理,您需要将store
设置为True
使其可搜索。如果您需要定义一个新字段,则使用相同的逻辑并在批处理模型中定义它以在 lot_id
字段域中使用。
你得到那个错误是因为 Odoo 期望一个 dictionary它得到了一个列表。
The method may return a dictionary for changing field domains and pop up a warning message, like in the old API.
在最后两个示例中,您将选择属性设置为字符串,但 selection
属性指定了该字段的可能值。它以成对列表(value
、string
)、模型方法或方法名称的形式给出。您可以在 website_customer 中找到示例模块。
编辑:(从 onchange
方法返回域)
该方法可能会返回一个用于更改字段域的字典,并弹出一条警告消息,就像在旧的 API 中一样:
return {
'domain': {'other_id': [('partner_id', '=', partner_id)]},
'warning': {'title': "Warning", 'message': "What is this?"},
}
关于Odoo 制造拣货 - 显示数量大于零的批处理 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64982123/