将来自两个模型的两个 Float 字段以相同的形式求和 - Odoo v8
Sum two Float fields from two models, on the same form - Odoo v8
假设我有:
class Model1(models.Model):
name = fields.Char(string="Name")
one_1 = fields.One2many('Model2', 'field_many', string="")
one_2 = fields.One2many('Model3', 'field_many2', string="")
one_3 = fields.One2many('Model4', 'field_many3', string="")
这些是从 One2many
个字段调用的模型:
class Model2(models.Model):
field_many = fields.Many2one('Model1', string="")
field_float1 = fields.Float()
class Model3(models.Model):
field_many2 = fields.Many2one('Model1', string="")
field_float2 = fields.Float()
class Model4(models.Model):
field_many3 = fields.Many2one('Model1', string="")
field_float3 = fields.Float()
我需要对 field_float1
和 field_float2
求和并在 field_float3
上显示结果,但问题是,或者让我对重要的事情感到困惑的事实是sum 不仅仅是同一模型中的总和。
我能做到:
@api.onchange('field_float1', 'field_float2')
def _compute_amount_move_sales_current(self):
if self.field_float1 or self.field_float2:
self.field_float3 = self.field_float1 + self.field_float2
但是这些是来自两个模型的字段,其结果应该反映在第三个模型字段上,另外,这些模型以 Model1
形式表示,通过 3 One2many
树视图,或线作为他们经常被叫到 Odoo。
所以,它只是要读取前两个字段,但它必须在表单 Model1
上,这将创建新记录。不是数据库 table.
编辑
这是一个更准确的解释,用户使用这些行或 One2many
字段创建新记录,在所有情况下前两个必须填写,所以我认为可以用 required=True
字段上的标志。
但是,我试过这种方式:
class Model1(models.Model):
name = fields.Char(string="Name")
one_1 = fields.One2many('Model2', 'field_many', string="")
one_2 = fields.One2many('Model3', 'field_many2', string="")
one_3 = fields.One2many('Model4', 'field_many3', string="", onchange="compute_sum")
@api.onchange('one_1', 'one_2')
def compute_sum(self):
if self.one_1.field_float1 or self.one_2.field_float2:
self.one_3.field_float3 = self.one_1.field_float1 + self.one_2.field_float2
但是它不起作用,每当我填写其中一个必需的 field_float 它说:
ValueError
Expected singleton: Model4()
为了进一步说明,模型如下所示:
class Model2(models.Model):
field_many = fields.Many2one('Model1', string="")
field_float1 = fields.Float()
field_float_ = fields.Float()
field_integer = fields.Integer()
field_char = fields.Char()
class Model3(models.Model):
field_many2 = fields.Many2one('Model1', string="")
field_float2 = fields.Float()
integer = fields.Integer()
class Model4(models.Model):
field_many3 = fields.Many2one('Model1', string="")
field_float3 = fields.Float()
chars = fields.Char()
bool = fields.Boolean()
我的意思是,这些模型中的每一个都有几个字段,它们是从 Model1
和 One2many
字段调用的,只是那些浮点数需要操作,而不是每个都需要操作。
用户将按顺序填写这些字段,使用类似 state
的表格,statusbar
等,按顺序填写。
如果您想求和
,此解决方案有效
field1 of record1 In first one2many field with field2 of record1 In second one2many field to put the the result in field3 of the first record.
这是了解您究竟需要什么的开始。
在你的 model1 makr third one2many field a compute field
@api.depends ('one_1', 'one_2','one_1.field1', 'one_2.field2')
def compute_sum(self):
# Then loop throw your records and compute sum
我会为你写更多的 cde,但我正在使用我的 phone 我可能会稍后编辑我的答案希望至少你明白了。
如果您使用 onchange,当用户更改 float 字段的值但删除 one_1.field1 如果您使用它时,它也可能会起作用。
请记住,您需要在 model1 中定义该方法,因为它在那里您拥有完全访问权限
假设我有:
class Model1(models.Model):
name = fields.Char(string="Name")
one_1 = fields.One2many('Model2', 'field_many', string="")
one_2 = fields.One2many('Model3', 'field_many2', string="")
one_3 = fields.One2many('Model4', 'field_many3', string="")
这些是从 One2many
个字段调用的模型:
class Model2(models.Model):
field_many = fields.Many2one('Model1', string="")
field_float1 = fields.Float()
class Model3(models.Model):
field_many2 = fields.Many2one('Model1', string="")
field_float2 = fields.Float()
class Model4(models.Model):
field_many3 = fields.Many2one('Model1', string="")
field_float3 = fields.Float()
我需要对 field_float1
和 field_float2
求和并在 field_float3
上显示结果,但问题是,或者让我对重要的事情感到困惑的事实是sum 不仅仅是同一模型中的总和。
我能做到:
@api.onchange('field_float1', 'field_float2')
def _compute_amount_move_sales_current(self):
if self.field_float1 or self.field_float2:
self.field_float3 = self.field_float1 + self.field_float2
但是这些是来自两个模型的字段,其结果应该反映在第三个模型字段上,另外,这些模型以 Model1
形式表示,通过 3 One2many
树视图,或线作为他们经常被叫到 Odoo。
所以,它只是要读取前两个字段,但它必须在表单 Model1
上,这将创建新记录。不是数据库 table.
编辑
这是一个更准确的解释,用户使用这些行或 One2many
字段创建新记录,在所有情况下前两个必须填写,所以我认为可以用 required=True
字段上的标志。
但是,我试过这种方式:
class Model1(models.Model):
name = fields.Char(string="Name")
one_1 = fields.One2many('Model2', 'field_many', string="")
one_2 = fields.One2many('Model3', 'field_many2', string="")
one_3 = fields.One2many('Model4', 'field_many3', string="", onchange="compute_sum")
@api.onchange('one_1', 'one_2')
def compute_sum(self):
if self.one_1.field_float1 or self.one_2.field_float2:
self.one_3.field_float3 = self.one_1.field_float1 + self.one_2.field_float2
但是它不起作用,每当我填写其中一个必需的 field_float 它说:
ValueError
Expected singleton: Model4()
为了进一步说明,模型如下所示:
class Model2(models.Model):
field_many = fields.Many2one('Model1', string="")
field_float1 = fields.Float()
field_float_ = fields.Float()
field_integer = fields.Integer()
field_char = fields.Char()
class Model3(models.Model):
field_many2 = fields.Many2one('Model1', string="")
field_float2 = fields.Float()
integer = fields.Integer()
class Model4(models.Model):
field_many3 = fields.Many2one('Model1', string="")
field_float3 = fields.Float()
chars = fields.Char()
bool = fields.Boolean()
我的意思是,这些模型中的每一个都有几个字段,它们是从 Model1
和 One2many
字段调用的,只是那些浮点数需要操作,而不是每个都需要操作。
用户将按顺序填写这些字段,使用类似 state
的表格,statusbar
等,按顺序填写。
如果您想求和
,此解决方案有效field1 of record1 In first one2many field with field2 of record1 In second one2many field to put the the result in field3 of the first record.
这是了解您究竟需要什么的开始。 在你的 model1 makr third one2many field a compute field
@api.depends ('one_1', 'one_2','one_1.field1', 'one_2.field2')
def compute_sum(self):
# Then loop throw your records and compute sum
我会为你写更多的 cde,但我正在使用我的 phone 我可能会稍后编辑我的答案希望至少你明白了。
如果您使用 onchange,当用户更改 float 字段的值但删除 one_1.field1 如果您使用它时,它也可能会起作用。
请记住,您需要在 model1 中定义该方法,因为它在那里您拥有完全访问权限