Openerp 如何修改Odoo9中其他类的选择字段?

Openerp 如何修改Odoo9中其他类的选择字段?,openerp,odoo-9,Openerp,Odoo 9,我想在验证发票后,修改与发票相关联的SaleOrder类中的invoice_status字段 发票的验证在AccountInvoice类中的account模块中定义: @api.multi def invoice_validate(self): ... 我意识到SaleOrder类中的name字段与AccountInvoice类中的origin字段相关 因此,我修改了invoice_validate函数,如下所示: @api.multi def invoice_validate(self)

我想在验证发票后,修改与发票相关联的SaleOrder类中的invoice_status字段

发票的验证在AccountInvoice类中的account模块中定义:

@api.multi
def invoice_validate(self):
  ...
我意识到SaleOrder类中的name字段与AccountInvoice类中的origin字段相关

因此,我修改了invoice_validate函数,如下所示:

@api.multi
def invoice_validate(self):
    for invoice in self:
        ...
        origin = self.origin
        sale_order_id = self.env['sale.order'].search([('name', '=', origin)])[0].id
        sale_order_obj = self.env['sale.order'].browse(sale_order_id)
        sale_order_obj.write({'invoice_status': 'invoiced'})
    return self.write({'state': 'open'})
invoice_status = fields.Selection(selection_add=[("state", "open")])
出于某种原因,书写部分不起作用

这是SaleOrder类中发票状态字段的正式定义:

invoice_status = fields.Selection([
    ('upselling', 'Upselling Opportunity'),
    ('invoiced', 'Fully Invoiced'),
    ('to invoice', 'To Invoice'),
    ('no', 'Nothing to Invoice')
    ], string='Invoice Status', compute='_get_invoiced', store=True, readonly=True, default='no')
选中selection类的selection\u add属性

如果要将某些项添加到选择字段,则必须在继承自同一模型的另一个类中重新定义它,并按如下方式声明它:

@api.multi
def invoice_validate(self):
    for invoice in self:
        ...
        origin = self.origin
        sale_order_id = self.env['sale.order'].search([('name', '=', origin)])[0].id
        sale_order_obj = self.env['sale.order'].browse(sale_order_id)
        sale_order_obj.write({'invoice_status': 'invoiced'})
    return self.write({'state': 'open'})
invoice_status = fields.Selection(selection_add=[("state", "open")])

检查Selection类文档并搜索代码库中的Selection\u add以查看一些示例。

您无法设置invoice\u status的值,因为它是一个计算字段。即使您设置了它的值,当它所依赖的字段发生更改时,它也会重新计算,最终会找到它应该具有的值,并写入该值而不是您的值


奥多这样做是为了在订单开具发票时它会说发票。所以我觉得你没必要这么做。如果您急需存储值,则应更改该字段,使其不再计算,或创建另一个字段。

谢谢您的回答,但这不是重点。我不想将新项目添加到选择字段。我想用它自己的值中的另一个值来修改它。避免返回的部分,这会让你困惑。我想将已存在的“发票”值设置为“发票状态”字段。是的,我知道如果该字段所依赖的字段发生更改,将重新计算该字段,但当我验证发票时,我永远不会更改该销售订单或发票,我希望“发票状态”字段具有该值。你的回答使我很清楚。感谢点击按钮会触发对记录的写入。假设sale.order中的字段依赖于发票id a引用。每次调用对引用发票的写入操作时,它都会触发该字段的计算。所以在最后一行中返回self.write{'state';'open'}:在写入记录之后,计算发生,并且您的值更改为您不想要的值。