首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Odoo -添加或编辑one2many字段时的计算

在Odoo中,one2many字段表示一个模型中的记录与另一个模型中的多个记录之间的关系。例如,一个销售订单可能有多个销售订单行。当你需要在添加或编辑one2many字段时进行计算,你可以使用Odoo的计算字段(computed fields)和onchange方法来实现。

以下是一些步骤和示例代码,帮助你在Odoo中添加或编辑one2many字段时进行计算:

1. 定义模型

假设我们有两个模型:sale.order(销售订单)和sale.order.line(销售订单行)。

代码语言:javascript
复制
from odoo import models, fields, api

class SaleOrder(models.Model):
    _name = 'sale.order'
    _description = 'Sale Order'

    name = fields.Char(string='Order Reference', required=True)
    order_line = fields.One2many('sale.order.line', 'order_id', string='Order Lines')

class SaleOrderLine(models.Model):
    _name = 'sale.order.line'
    _description = 'Sale Order Line'

    order_id = fields.Many2one('sale.order', string='Order Reference', required=True)
    product_id = fields.Many2one('product.product', string='Product', required=True)
    quantity = fields.Float(string='Quantity', required=True)
    price_unit = fields.Float(string='Unit Price', required=True)
    subtotal = fields.Float(string='Subtotal', compute='_compute_subtotal')

2. 添加计算字段

在上面的SaleOrderLine模型中,我们添加了一个计算字段subtotal,它将根据quantityprice_unit计算小计。

代码语言:javascript
复制
@api.depends('quantity', 'price_unit')
def _compute_subtotal(self):
    for line in self:
        line.subtotal = line.quantity * line.price_unit

3. 使用onchange方法

如果你需要在添加或编辑one2many字段时进行更复杂的计算或更新其他字段,可以使用onchange方法。

例如,当用户更改quantityprice_unit时,我们可能希望自动更新subtotal并计算整个订单的总金额。

代码语言:javascript
复制
@api.onchange('order_line')
def _onchange_order_line(self):
    total_amount = sum(line.subtotal for line in self.order_line)
    self.total_amount = total_amount

SaleOrder模型中添加total_amount字段:

代码语言:javascript
复制
total_amount = fields.Float(string='Total Amount', compute='_compute_total_amount')

@api.depends('order_line.subtotal')
def _compute_total_amount(self):
    for order in self:
        order.total_amount = sum(line.subtotal for line in order.order_line)

4. 视图更新

确保你的视图(XML)中包含了这些字段,并且正确设置了关系。

代码语言:javascript
复制
<record id="view_order_form" model="ir.ui.view">
    <field name="name">sale.order.form</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <form string="Sale Order">
            <sheet>
                <group>
                    <field name="name"/>
                    <field name="total_amount" readonly="1"/>
                </group>
                <notebook>
                    <page string="Order Lines">
                        <field name="order_line">
                            <tree string="Order Lines">
                                <field name="product_id"/>
                                <field name="quantity"/>
                                <field name="price_unit"/>
                                <field name="subtotal" readonly="1"/>
                            </tree>
                        </field>
                    </page>
                </notebook>
            </sheet>
        </form>
    </field>
</record>

通过这些步骤,你可以在Odoo中实现one2many字段的添加或编辑时的计算功能。确保你的计算字段和onchange方法正确处理了所有必要的业务逻辑。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

odoo 为可编辑列表视图字段搜索添加查询过滤条件

实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下图,列表网仓记录详情页面(form视图),编辑内联视图中的货主记录,为货主和仓库字段搜索,添加过滤条件...,具体如下: 添加、编辑货主时,下拉列表中只展示选取和当网仓记录所属公司关联的货主,点击搜索更多,仅展示和当前网仓记录所属公司关联的货主 添加、编辑货主时,下拉列表中只展示选取和当网仓记录关联的仓库(到...“仓库” Tab页中添加的仓库),点击搜索更多,仅展示和当前网仓记录关联的仓库。...--此处代码已省略--> odoo> 修改ResPartner,重写模型name_search(编辑货主字段,弹出下拉列表时,会请求该模型函数),search_read(编辑货主字段...,点击下拉列表时 搜索更多打开界面时,会请求该模型函数) 提示:分析OmsNetworkLine模型定义可知道,货主字段(partner_id)为多对一字段,关联ResPartner 模型 class

1.2K30

odoo 开发入门教程系列-模型之间的关系(Relations Between Models)

参考: 本主题相关文档可查阅 Many2one 在我们的房地产模块中,我们想定义房地产类型的概念,例如,房屋或公寓。...然而,在本例中,我们希望显示给定地产的报价列表,因此我们将使用one2many概念。 one2many是many2one的反向实现。...按照惯例,one2many字段都有_ids后缀。...首先,我们不需要所有模型的操作或菜单。某些模型只能通过另一个模型访问。在我们的练习中就是这样的:报价总是通过房产获得的。 其次,尽管property_id字段是必需的,但我们没有将其包含在视图中。...当我们通过one2many字段创建记录时,为了方便,会自动填充相应的many2one 添加odoo14\custom\estate\models\estate_property_offer.py #!

4.5K40
  • odoo 开发入门教程系列-模块交互

    我们希望为estate.property模型添加功能,即我们希望在出售房产时添加一些额外的逻辑。 第一步,我们需要扩点击“Sold”按钮时调用的操作。...不幸的是,没有一种简单的方法可以知道如何在Odoo中创建任何给定的对象。大多数时候,有必要查看其模型,以找到所需的字段并提供适当的值。 学习的一个好方法是看看其他模块是如何完成你想做的事情的。...为此在account.move创建中包含invoice_line_ids字段,这是一个One2many字段。One2many和Many2many使用通用ORM方法中描述的特殊“commands”。...下面是一个在创建test.model时包含一个One2many字段line_ids的简单示例: def inherited_action(self): self.env["test.model"...创建account.move时添加两个发票行。

    1.7K10

    odoo ORM API学习总结兼orm学习教程

    取决于字段属性,添加一个默认的公司domain class odoo.fields.One2many[源代码] One2many字段的值为 comodel_name中所有满足条件的记录的结果集,而目标模型中的...取决于字段属性,添加一个默认的公司条件 limit (int) – 读取时用的可选限制 注意:odoo不会在当前模型对应表中为One2many,Many2many类型的属性建立对应的表字段,但会为Many2one...他们在请求时被计算并返回。 设置store=True 将在数据库中存储计算及字段并启动开启字段搜索。 也可以通过设置search参数开启在计算字段上的搜索。该参数值为一个返回搜索条件的方法名称 。...所有无语义属性都从源字段复制。 默认的, related字段: 不被存储 不被复制 只读 超级用户模式下被计算 像计算字段那样,添加 store=True 以存储related字段。...related字段依赖项中包含 Many2many 或者 One2many 字段 related 可以用于引用另一个模型中的 One2many 或Many2many 字段,前提是通过当前模型的一个Many2one

    13.5K10

    odoo 开发入门教程系列-计算的字段和变更(Computed Fields And Onchanges)

    每当修改字段的某些依赖项时,ORM使用给定的依赖项来触发字段的重新计算 from odoo import api, fields, models class TestComputed(models.Model...定义一个适当的inverse函数这样,以便用户可以编辑 create_date或 validity。...提示: create_date 仅在记录创建时被填充,因此需要一个回退,防止创建时的奔溃 在表单和列表视图中添加字段,正如本章目标中显示的第二个动画中的一样。...description 当数以百万计的记录需要重新计算时,这可能会很快会变得无法承受 还值得注意的是,计算的字段可以依赖于另一个计算的字段。...要计算的字段越复杂(例如,具有大量依赖项或当计算的字段依赖于其他计算的字段时),计算所需的时间就越长。请务必事先花一些时间评估计算的字段的成本。

    3.2K30

    odoo 开发入门教程系列-继承(Inheritance)

    在介绍特定的Odoo模块继承之前,让我们看看如何更改标准CRUD(创建、检索,更新或删除)方法的行为 Python继承(Python Inheritance) 目标: 不能删除状态不为New、Canceled...为此,我们需要向res.users模型添加一个字段,并调整其视图以显示它。 Odoo提供了两种继承机制来以模块化的方式扩展现有模型。...第一继承机制允许模块通过以下方式修改在另一个模块中定义的模型的行为: 向模型添加字段 覆盖模型中字段的定义 给模型添加约束 给模型添加方法 重写模型中的现有方法 第二种继承机制...odoo中,第一种机制最常用。在我们的例子中,我们希望向现有模型添加一个字段,这意味着我们将使用第一种机制。...练习--添加字段到用户模型 添加一下字段到res.users: Field Type property_ids One2many inverse of salesman_id to estate.property

    2.3K20

    odoo 开发入门教程系列-基本视图

    在上一章中已经看到,odoo能够为给定模型生成默认视图。实际上,默认视图对于业务应用程序来说是不可接受的。相反,我们至少应该以逻辑的方式组织各个字段。 视图是在带有操作和菜单的XML文件中定义的。...练习 -- 添加自定义表单视图 在合适的XML文件中为estate.property 定义视图 为了避免每次修改视图时都重新启动服务器,可以在启动服务器时添加--dev-xml,以便只刷新页面就可以查看视图修改...在自定义搜索视图中添加用户可能过滤的字段是非常常见的。 搜索视图还可以包含元素,这些元素充当预定义搜索的开关。...在odoo中,domain对记录上的条件进行编码:domain是用于选择模型记录子集的条件列表。每个条件都是一个包含字段名、运算符和值的三元组。...运算顺序 以二元运算为例,从左至右读入表达式,遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。

    3.4K40

    odoo 权限管理学习总结

    --略--> odoo> 查看效果 注意: 实践时发现,通过界面点击,访问一些菜单界面时,会在菜单访问URL(参见菜单访问自动生成的URL)中自动添加model,...规则与组的关联关系存在rule_group_rel表中 global 根据“groups”计算,提供了对规则是否全局状态的轻松访问。...如果当前用户不在列出的组中,他将无权访问该字段: 将自动从请求的视图中删除受限制的字段 从fields_get()响应中删除受限制的字段 尝试(显式的)读取或写入受限字段会导致访问错误 修改estate..."/> 验证,发现界面上,未授权上述框选权限的用户已经看不到上述字段了 注意:通过为当前视图中目标字段添加groups属性实现的权限控制仅作用于当前视图,如果希望当前视图模型(Model)的所有视图中,...对该字段实现统一的权限控制话,需要在模型定义中,为目标字段添加groups属性,如下: selling_price = fields.Float('selling price', digits=(8,

    10.2K20

    「Odoo 基础教程系列」第三篇——从 Todo 应用开始(2)

    在这篇教程里我们将会了解到 Odoo 模型里的一些其他类型的字段和特殊机制,而我依然会继续带领大家一起完善我们的 Todo 应用,不断地往里面添加一些新的功能特性,让它看起来更丰满也更实用一些。...选择字段 在上一篇教程中,我们已经创建好了待办事项的模型,但是只是添加了「描述」和「已完成?」两个字段,这肯定是不能满足我们的需求的。...此处我们还给这个字段添加了默认值 todo,表示当一个待办事项被创建后,如果没有指定紧急程度,将默认是待办状态。我们可以为任意类型的字段添加默认值。...这个需求跟时间有关,并且时间是流动(一直在变化)的,所以我们应该要有一个方法在用户每次打开待办事项之前,把这个结果计算好,并且反馈给用户,还好 Odoo 的 ORM 已经为我们实现了相关的机制——计算字段...然后我们再看到 标签多了一个属性 decoration-danger,这个属性可以接受表达式或字段名作为值,当结果为真时,这个属性就会生效,将 TreeView 中满足表达式的行以红色标记

    1.4K10

    odoo context上下文用法总结

    _context is {'key1': True, 'key2': True} 需要注意的是,上下文是和记录集绑定的,修改后的上下文并不会在其它记录集中共享 应用场景示例 用于action,为关联视图添加默认搜索...、过滤条件 视图定义 为设置action打开的tree列表视图,添加默认搜索,搜索条件为 state字段值等于True 添加分组查询条件 视图设计 odoo> 说明:context属性值中的字典的键值如果为模型中定义的字段名称,则该字段名称必须以元素的形式,出现在模型对应的视图(即不能是内联视图,比如内联Tree列表)中,否则会出现类似错误提示...为可编辑列表视图字段搜索添加查询过滤条件](odoo 为可编辑列表视图字段搜索添加查询过滤条件.md) 用于记录集,传递数据给模型方法 模型设计 #!

    2.2K20

    odoo 开发入门教程系列-约束(Constraints)

    约束(Constraints) 上一章介绍了向模型中添加一些业务逻辑的能力。我们现在可以将按钮链接到业务代码,但如何防止用户输入错误的数据?...也通过CHECK(selling_price > 0)校验的 修改odoo14\custom\estate\models\estate_property_tag.py,添加SQL约束 _sql_constraints...Python约束定义为用 constrains()修饰的方法,并在记录集上调用。修饰符指定约束中涉及哪些字段。当修改这些字段中的任何字段时,将自动计算约束。...Python约束 添加售价不能低于预期价格90%的约束 提示: 报价生效前,保持售价为0。...警告 当和浮点数打交道时,总是使用从 odoo.tools.float_utils导入的float_compare() 和float_is_zero()方法 确保每次售价或者预期价格改变时,自动触发约束

    1.5K20

    odoo 开发入门教程系列-模型和基本字段

    模型和基本字段 在上一章的末尾,我们创建一个odoo模块。然而,此时它仍然是一个空壳,不允许我们存储任何数据。...给模型表estate_property添加字段 添加以下字段到表中 Field Type name Char description Text postcode Char date_availability...现在假设要求 name 和expected_price字段值不为null,所以需要对其修改,如下,添加字段属性配置required=True name = fields.Char(required=True...required (bool, default: False) 如果为 True, 表示该字段值不能为空。创建记录时必须拥有默认值或给定的值。...自动创建的字段(Automatic Fields) 参考: 该话题相关文档可参考 Automatic fields. odoo会在所有model(当然,也可以配置禁止自动创建某些字段)中创建少数字段。

    2.4K30

    如何在 CentOS 8 上安装 Odoo 13

    七、创建一个 Systemd Unit 文件 打开你的文本编辑器,并且在/etc/systemd/system/目录下创建一个名为odoo13.service的文件: sudo nano /etc/systemd...打开你的文本编辑器,创建或者编辑域名服务器配置块: sudo nano /etc/nginx/conf.d/example.com 下面的配置将会建立 SSL,HTTP 转向 HTTPS,WWW 转向...想要启用多进程,你需要编辑 Odoo 配置文件,并且设置一个非 0 的工作进程数字。工作进程数字,基于 系统中的 CPU 核心数字和可用的 RAM 内存来计算。...通过 Odoo 官方文档计算工作进程的数量以及需要的 RAM 内存大小,你可以使用下面的公式: 工作进程数量计算: 工作进程最大数量理论值 = (system_cpus * 2) + 1 1 个工作进程可以服务...想要切换到多进程模式,打开配置文件,并且添加计算值: /etc/odoo13.conf limit_memory_hard = 2684354560 limit_memory_soft = 2147483648

    4K20

    如何在 Ububtu 18.04 上安装 Odoo 13

    mkdir /opt/odoo13/odoo-custom-addons 稍后,我们将会将该目录添加到addons_path参数中。这个参数定义了 Odoo 用来搜索模块的一个列表。...打开你的文本编辑器,创建或者编辑域名服务器配置块: sudo nano /etc/nginx/sites-enabled/example.com 下面的配置将会建立 SSL,HTTP 转向 HTTPS,...想要启用多进程,你需要编辑 Odoo 配置文件,并且设置一个非 0 的工作进程数字。工作进程数字,基于 系统中的 CPU 核心数字和可用的 RAM 内存来计算。...通过 Odoo 官方文档计算工作进程的数量以及需要的 RAM 内存大小,你可以使用下面的公式: 工作进程数量计算: 工作进程最大数量理论值 = (system_cpus * 2) + 1 1 个工作进程可以服务...想要切换到多进程模式,打开配置文件,并且添加计算值: /etc/odoo13.conf limit_memory_hard = 2684354560 limit_memory_soft = 2147483648

    8.8K41

    odoo 开发入门教程系列-一些用户界面

    上一章,我们通过CSV文件添加了数据。当需要添加数据格式简单时,用CSV格式还是很方便的,当数据格式更复杂时(比如视图架构或者一个邮件模板),我们使用XML格式。...类似CSV文件,XML文件也必须按约定添加到合适的目录,并在 __manifest__.py中进行定义。数据文件中的内容也是在模块安装或者更新时按序加载。...因此,对CSV文件所做的所有说明对XML文件都适用。当数据链接到视图时,我们将它们添加到views文件夹中 本章,我们将通过XML文件加载我们第一个action和菜单。...Odoo有许多微调方式,但通常第一步是确保: 某些字段有默认值 某些字段只读 当记录重复时,某些字段不能被拷贝 在我们的房产业务案例中,我们希望:: 售价只读(往后将自动填充) 当记录重复时,可用日期和售价不能被拷贝...我们看到一些属性,如required=True,会影响数据库中的表模式。其他属性也将影响视图或提供默认值。 练习 -- 添加一些属性到字段。

    3K30

    odoo wizard界面显示带复选框列表及勾选数据获取

    wizard可以通过关系字段(many2one或many2many)引用常规记录或wizard记录,但常规记录不能通过many2one字段引用wizard记录 详细代码 注意:为了更清楚的表达本文主题...可选 modelMethod 点击列表复选框时,需要调用的模型方法,通过该方法收集列表勾选记录的数据。可选。...> 说明: saveSelectionsToSessionStorage 为"true"则表示点击复选框时,将当前选取的记录存到浏览器sessionStorage中,可选 odoo14\custom\estate...this.modelName = undefined; // 定义点击列表复选框时需要访问的模型 this.modelMethod = undefined; // 定义点击列表复选框时需要调用的模型方法...如果希望hasCheckBoxes,modelName,modelMethod等也可作用于非内联tree视图,则需要编辑该文件,添加hasCheckBoxes,modelName,modelMethod

    5.3K60
    领券