为什么在 Odoo 中保存时字段的顺序会发生变化?

Why the sequence of a field changes when saved in Odoo?

我有一个 sale.order.line 模型的表单视图,并创建了一个名为 ' niu ' 的字段(序列字段),它会自动增加其值。

对于您添加到表格中的每种可库存产品类型,它工作正常但我有一个问题,因为当您添加可堆叠产品时,该值会增加,但是当我按下 'Save ' 按钮时会自动更改顺序.

见下图:

这是模型中的“niu”字段和sale.order.line方法:

niu = fields.Char(string="NIU", compute="_niu_validation", readonly=True, store=True)

@api.depends('product_id.product_tmpl_id.type')
def _niu_validation(self):
    for rec in self:
        if rec.product_id.product_tmpl_id.type == 'product' and not rec.niu:
                rec.niu = self.env['ir.sequence'].next_by_code('sale.order.line')

怎样才能使序号不变,初始号成立?

这是因为next_by_code()方法根据nextval() function of PostgreSQL生成值。

您调用了 ir.sequence object 的 next_by_code() 方法。在这个方法中调用方法_next()。让我们看看 body:

def _next(self):
    if self.sequence_id.implementation == 'standard':
        number_next = _select_nextval(self.env.cr, 'ir_sequence_%03d_%03d' % (self.sequence_id.id, self.id))
    else:
        number_next = _update_nogap(self, self.sequence_id.number_increment)

    return self.sequence_id.get_next_char(number_next)

新值是使用number_next生成的。在你的情况下 _select_nextval 将被称为:

def _select_nextval(cr, seq_name):
    cr.execute("SELECT nextval('%s')" % seq_name)

    return cr.fetchone()

如您所见,查询中调用了函数 nextval

工作原理。

当你在表单中添加一些sale.order.line时,OpenERP将调用方法_niu_validation。这是因为 object(每行)将为您的字段计算值 niu。在您的方法中,它由 next_by_code 调用。这意味着 before save(仅用于 GUI/树视图)postgreSQL 更改了序列。当您单击 保存 按钮(在 header 中)时,系统会再次调用 _niu_validation

总结一下。 在您单击 保存 之前,Odoo 不会应用树视图中的更改。您在 tree view 中进行了一些更改,同时序列将在 db 中更改(因为您计算列 NIU 的值)。但是这些行没有保存在数据库中。

您可以在此处查看其工作原理:path_to_odoo/openerp/addons/base/ir/ir_sequence.py

怎样做才能使顺序不变?

您可以删除方法 _niu_validation,覆盖 sale.order.line 的方法 create,并在存储行时计算字段值。 但在这种情况下,用户将看不到列 'on fly' 的新值。

希望对您有所帮助。

还有一件值得思考的事情(如果你想使用你的方法)。想象一下,几个人同时处理一份订单。