Odoo制造拣选-显示数量大于0的批次

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=字段.

我在生产领料操作中添加了很多数量字段。它完美地反映了与位置相关的批次数量。现在的问题是,我不想显示没有产品的批次,即0数量。我如何做到这一点

这是我想要更改的屏幕截图

以下是型号代码(stock\u move\u line.py):

类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': ['&amp;', ('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,但仍然在中获取空数据