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

Python 为什么在Odoo中保存时字段的顺序会发生变化?,python,openerp,odoo-9,Python,Openerp,Odoo 9,我有一个用于sale.order.line模型的表单视图,并创建了一个名为'niu'的字段(序列字段),它会自动增加其值 对于您添加到表单中的每种可储存产品类型,该表单工作正常,但我有一个问题,因为当您添加可堆叠产品时,值会增加,但当我按下“保存”按钮时,会自动更改顺序 请参见以下附加图片: 这是模型中的“niu”字段和sale.order.line方法: niu = fields.Char(string="NIU", compute="_niu_validation", readonly=

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

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

请参见以下附加图片:

这是模型中的“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\u by\u code()
方法基于生成值

您调用了
ir.sequence
对象的
next\u by\u code()
方法。在此方法中,调用方法
\u next()
。让我们看看身体:

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\u next生成新值。在您的情况下,
\u select\u nextval
将被调用:

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

    return cr.fetchone()
如您所见,函数
nextval
在查询中被调用

它是如何工作的。

当您在表单中添加一些
sale.order.line
时,OpenERP将调用方法
\u niu\u validation
。这是因为对象(每行)将计算字段的值
niu
。在您的方法中,它由
next\u by\u code
调用。这意味着在保存之前(仅用于GUI/树视图),postgreSQL更改了序列。当您点击保存按钮(在标题中)时,系统再次调用
\u niu\u验证

总而言之。 在单击“保存”之前,Odoo不会在树视图中应用更改。您在
树状视图中进行了一些更改
,同时序列将以db为单位进行更改(因为您计算列
NIU
)的值)。但这些行不保存在db中

您可以在这里检查它的工作方式:
path\u to\u odoo/openerp/addons/base/ir/ir\u sequence.py

你能做些什么使序列不被改变

您可以删除方法
\u niu\u验证
,覆盖方法
sale.order.line的创建
,并在存储行时计算字段值。 但在这种情况下,用户将不会看到“动态”列的新值

希望这对你有帮助


还有一件事值得考虑(如果你想使用你的方法)。假设几个人同时处理一个订单

您好,关于段落:您可以删除方法_niu_验证,覆盖sale.order.line的方法create,并在存储行时计算字段值。但在这种情况下,用户将不会看到“动态”列的新值。如何创建方法来计算存储时字段的值?我通过create(self)@api.model def create(self)方法重写了验证:对于self中的记录集:if rec.product_id.product_tmpl_id.type==“product”而不是rec.niu:rec.niu=self.env['ir.sequence']。下一步通过模型中的代码('sale.order.line'):
niu=fields.Char(string=“niu”,readonly=True)@api.model def create(self,vals):vals[u'niu']=#在此处写入任何逻辑。。。return super(NameYourClass,self)。create(vals)
在我的模型中,我放置了以下内容,但当我按下保存按钮时,没有创建序列。为什么会发生这种情况@api.model def create(self,vals):对于self中的rec:if rec.product_id.product_tmpl_id.type=='product'而不是rec.niu:vals[u'niu']=self.env['ir.sequence']。next_by_代码('sale.order.line')返回super(SaleOrderLine,self)。以类似方式为销售工作中的发票创建(vals)@beriliox名称(
sale.order
Odoo对象)。要了解更多信息,请参阅
path\u to\u Odoo/addons/sale/sale.py
@beriliox查看其他应用程序的源代码。这是了解系统工作原理的唯一方法。