Odoo制造拣选-显示数量大于0的批次
我在生产领料操作中添加了很多数量字段。它完美地反映了与位置相关的批次数量。现在的问题是,我不想显示没有产品的批次,即0数量。我如何做到这一点 这是我想要更改的屏幕截图 以下是型号代码(stock\u move\u line.py):Odoo制造拣选-显示数量大于0的批次,odoo,odoo-10,odoo-11,odoo-12,Odoo,Odoo 10,Odoo 11,Odoo 12,我在生产领料操作中添加了很多数量字段。它完美地反映了与位置相关的批次数量。现在的问题是,我不想显示没有产品的批次,即0数量。我如何做到这一点 这是我想要更改的屏幕截图 以下是型号代码(stock\u move\u line.py): 类StockMoveLine(models.Model): _name=“stock.move.line” _description=“产品移动(库存移动行)” _rec_name=“产品标识” _order=“结果\包装\标识说明,标识” lot\u id=字段.
类StockMoveLine(models.Model):
_name=“stock.move.line”
_description=“产品移动(库存移动行)”
_rec_name=“产品标识”
_order=“结果\包装\标识说明,标识”
lot\u id=字段.manyOne('库存.生产.批次','批次/序列号123')
x\u lot\u qty=fields.Float(compute=“fetch\u lot\u wrt\u location”,
name=“批次数量”,
store=True,
readonly=True,
数字=(12,3))
@api.onchange('lot\u id','location\u id')
def fetch_lot_wrt_位置(自身):
self.x_批次数量=0.0
对于self中的行:
quants=self.env['stock.quant'].search([('lot\u id.id','=',row.lot\u id.id)])
对于以数量表示的数量:
如果row.location\u id.display\u name==quant.location\u id.display\u name:
第x行\批次\数量=数量
以下是视图(stock\u move\u views.xml):
我确实通过域属性应用了过滤器,但它不起作用。如何限制数量为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")
当列表为空时,没有错误。当有非空地块时,我将获得eror。我需要一些帮助。我想应该是这样的
lot\u id=fields.manyOne('stock.production.lot','lot/Serial number 123'
domain=“[('product_id','=',parent.product_id),('product_qty','>',0)])
我的理解是,您只想显示那些具有
超过0种产品,在您的批次下拉列表中
您可以在您的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_qty', '>', 0)]" //View this
groups="stock.group_production_lot"
context="{'default_product_id': parent.product_id, 'active_picking_id': picking_id}"/>
Odoo在库存生产批次模型中定义了一个产品数量字段,您可以在域中使用该字段来过滤批次,并且您需要将
存储设置为真
,以使其可搜索。如果需要定义一个新字段,则使用相同的逻辑,并在批次模型中定义该字段,以便在批次id
字段域中使用
你得到这个错误是因为Odoo需要一个列表,而它得到了一个列表
该方法可能会返回一个用于更改字段域的字典,并弹出一条警告消息,就像在旧的API中一样
在最后两个示例中,您将选择属性设置为字符串,但selection
属性指定此字段的可能值。它以成对列表(value
,string
)或模型方法或方法名称的形式给出。您可以在模块中找到一个示例
编辑:(从onchange
方法返回域)
该方法可能会返回用于更改字段域的字典,并弹出警告消息,如旧API中所示:
return {
'domain': {'other_id': [('partner_id', '=', partner_id)]},
'warning': {'title': "Warning", 'message': "What is this?"},
}
将此添加到stock.move.line模型中:
@api.onchange('parent.product_id')
def _onchange_product_id(self):
quants = self.env['stock.quant'].search([('product_id', '=', self.parent.product_id.id), ('quantity', '>', 0)])
return {
'domain': {
'lot_id': [
('id', 'in', quants.lot_id.ids)
],
},
}
它不起作用,字段x_lot_qty。。它是在考虑位置的情况下计算批号中的产品数量。。。我做了一些类似于lot\u id=fields.manyOne('stock.production.lot','lot/Serial Number1234',domain=“[('product\u id','=',,parent.product\u id),('x\u lot\u qty','>,0)],x\u lot\u qty
在stock.move.line
上,但您可以从stock.production.lot
进行搜索,因为批次id在库存移动行中不可用。。我的目标是只显示那些产品数量大于0的批次,就位置而言,它不起作用。。。每次都应该有一个筛选器('product_id','=',parent.product_id)。。否则,它将显示所有产品批次,然后产品数量不起作用,因为它包含总产品数量,而不是按批次编号。因此,我创建了一个名为x\U批次数量的自定义计算字段,以便它在“自”列中查看选择的位置和选择的产品,然后显示数量。因此,我们需要考虑AsSoLe=域[= ](‘产品TythID’,‘Posith.ToeTuffID’),(但是‘xLoopyQTy’,‘>’,0’)〕但是得到这个错误“ValueError:无效字段XLoLyQTY”在叶中“”你正在尝试<代码>(‘xLoopyQTy’,‘>’,0’)< /代码>,但我是说<代码>(“产品ToqQTy”,'>,0)< /代码>试试这个,亲爱的朋友:)你好,阿达姆斯特劳斯,它不起作用,因为stock.production.lot的“product\u quantity”字段是计算字段和非存储字段。哦,明白了,那么解决方案是什么吗?任何指导:)你能详细说明我是如何使用代码的吗?因为我遵循了与链接相同的逻辑,即[(quant.lot\u id.display\u name,str.title(quant.lot\u id.display\u name)]用于quant in quants]但得到相同的错误“AttributeError:“list”对象没有属性“get”。您得到了该错误,因为您返回了一个列表,而Odoo需要一个字典。您需要从计算选择值的方法中删除onchange
decorator。当我删除onchange decorator时,每次选择方法返回空值时,我都会将return语句更改为{str(quant.lot\u id.id):str.title(quant.lot\u id.display\u name)表示quant}中的quant,但仍然在中获取空数据