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查看其他应用程序的源代码。这是了解系统工作原理的唯一方法。