模型和基本字段 在上一章的末尾,我们创建一个odoo模块。然而,此时它仍然是一个空壳,不允许我们存储任何数据。...) 参考: 和本主题关联文档可参考 Models API....ORM 层是odoo的一个关键组件。该层避免了手动写入大部分SQL并提供可扩展性和安全服务. 业务对象被定义为继承于 Model的Python类。可以通过在定义中设置属性来配置model。...api, SUPERUSER_ID 练习 创建estate_property表的最小化模型 在 odoo14/custom/estate/models/estate_property.py 中定义model...有两大类领域字段:‘简单’字段--直接存储在模型表中的原子值,形如Boolean, Float, Char, Text, Date 和Selection, ‘关系型’ 字段--连接相同或者不同模型的记录
客户端通过JSON-RPC或者XML-RPC与服务器进行通信。 开发 实现功能 数据访问功能:信息的增删查改。...开发自己的模块时,需要在模块所在目录下,创建两个文件:init.py和__manifest__.py,在其中定义模块的初始化操作以及模块的描述。...然后使用自己的模块:把自己的模块路径设置到odoo中,重启odoo让其搜索到自定义模块,即可通过odoo进行安装。...类,定义出的模型类会自动与Odoo提供的ORM接口匹配,也就是说这些模型类会自动存入sql中。...脚手架 odoo-bin scaffold 命令新建了我们的 aaa 应用 …/odoo-bin scaffold aaa 模块开发流程 分析模块模型,得出模型所需的字段有哪些,然后定义模型类——
计算的字段和变更(Computed Fields And Onchanges) 模型之间的关系是任何Odoo模块的关键组成部分。它们对于任何业务案例的建模都是必要的。...本章目标 在房地产模型中,自动计算总的面积和最佳报价 预期效果: 在地产报价模型中,自动计算合法的日期且可被更新 在我们的房地产模块中,我们定义了生活区和花园区。...自然地我们将总面积定义这两者的总和,我们将为此使用计算的字段的概念,即给定字段的值将从其他字段的值中计算出来。 到目前为止,字段已直接存储在数据库中并直接从数据库中检索。字段也可以被计算。...在这种情况下,不会从数据库中检索字段的值,而是通过调用模型的方法来动态计算的字段的值。 要创建计算的字段,请创建字段并将其属性compute设置为方法的名称。...computed field和onchanges的常见陷阱是试图通过添加过多逻辑来变得“过于智能”。这可能会产生与预期相反的结果:终端用户被所有自动化所迷惑。
)通过使用callback(term)来检索术语的翻译来翻译value` class odoo.fields.Float[源代码] float的封装 精度数字由可选的digitals属性给出。...API模块定义了Odoo环境和方法修饰符 odoo.api.autovacuum(method)[源代码] 修饰一个方法,使其由日常vacuum cron作业(模型ir.autovacuum)调用。...在这种情况下,通过使用字段的模型调用函数来提供依赖项 odoo.api.depends_context(*args)[源代码] 返回一个修饰符,该修饰符指定非存储的“compute”方法的上下文依赖项..._inherit和 _name 属性时,Odoo使用现有模型(通过_inherit提供)作为base创建新模型。...如果扩展了模型,还可以通过在子类上重新定义具有相同名称和类型的字段来扩展字段定义。在这种情况下,字段的属性取自父类,并由子类中给定的属性覆盖。
在介绍特定的Odoo模块继承之前,让我们看看如何更改标准CRUD(创建、检索,更新或删除)方法的行为 Python继承(Python Inheritance) 目标: 不能删除状态不为New、Canceled...为此,我们需要向res.users模型添加一个字段,并调整其视图以显示它。 Odoo提供了两种继承机制来以模块化的方式扩展现有模型。...第一继承机制允许模块通过以下方式修改在另一个模块中定义的模型的行为: 向模型添加字段 覆盖模型中字段的定义 给模型添加约束 给模型添加方法 重写模型中的现有方法 第二种继承机制...(委托)允许将模型的每个记录链接到父模型的记录,并提供对该父记录的字段的透明访问。...odoo中,第一种机制最常用。在我们的例子中,我们希望向现有模型添加一个字段,这意味着我们将使用第一种机制。
--此处代码略...--> 说明:'group_by': '分组字段名称' 用于视图对象按钮,传递数据给模型方法 模型设计 #!...> 说明:context属性值中的字典的键值如果为模型中定义的字段名称,则该字段名称必须以元素的形式,出现在模型对应的视图(即不能是内联视图,比如内联Tree列表)中,否则会出现类似错误提示...> 用于视图关系字段,传递数据给模型方法 模型设计 #!...为可编辑列表视图字段搜索添加查询过滤条件](odoo 为可编辑列表视图字段搜索添加查询过滤条件.md) 用于记录集,传递数据给模型方法 模型设计 #!...def create(self, vals_list): # 通过重写模型的create或者write方法,调用该方法前修改上下文,然后在方法中通过self.env.context获取上下文中的目标
SQL 参考:与此主题相关的文档可以查看 Models 和PostgreSQL文档 我们通过模型属性_sql_constraints来定义SQL约束,该属性被赋值为一个包含三元组(name, sql_definition...required=True, default=100.0) name = fields.Char(string='Name', related='account_id.name', readonly=False..., ] 练习--添加SQL约束 添加以下约束到对应模型: 房产预期价格必须为正数 房产售价必须为正数 报价必须为正数 房产标签名称和类型名称必须唯一 使用-u estate选项重新启动服务器以查看结果...修饰符指定约束中涉及哪些字段。当修改这些字段中的任何字段时,将自动计算约束。...警告 当和浮点数打交道时,总是使用从 odoo.tools.float_utils导入的float_compare() 和float_is_zero()方法 确保每次售价或者预期价格改变时,自动触发约束
每个访问权限关联一个模型,一个group(针对全局访问,没有组) 和一系列权限:create, read, write 和unlink(等同于delete)。...=False or perm_write!=False or perm_create!=False or perm_unlink!...=False) 将任意一个perm_method设置为eval="True"、eval="1" ,并将规则授权给用户,规则生效,所以我个人理解,目前记录规则,就是用于过滤记录的,通过domain_force...注意:通过为当前视图中目标字段添加groups属性实现的权限控制仅作用于当前视图,如果希望当前视图模型(Model)的所有视图中,对该字段实现统一的权限控制话,需要在模型定义中,为目标字段添加groups...修饰符,解决安装报错问题: AttributeError: module 'odoo.api' has no attribute 'multi' 说明:Odoo 13.0开始,移除multi,multi
实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下图,列表网仓记录详情页面(form视图),编辑内联视图中的货主记录,为货主和仓库字段搜索,添加过滤条件...注意,这个字段和OmsNetwork.company_id关联了相同模型,所以下文可用这个字段进行搜索过滤 'res.company', 'Company', index=True,...--此处代码已省略--> 修改ResPartner,重写模型name_search(编辑货主字段,弹出下拉列表时,会请求该模型函数),search_read(编辑货主字段...,点击下拉列表时 搜索更多打开界面时,会请求该模型函数) 提示:分析OmsNetworkLine模型定义可知道,货主字段(partner_id)为多对一字段,关联ResPartner 模型 class...name_search,search_read 提示:分析OmsNetworkLine模型定义可知道,仓库字段(warehouse_id)为多对多字段,关联stock.warehouse 模型 class
实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如图,给表单新增一个类似聊天的窗口,当记录一些表单活动(本例为自动记录当前记录状态变化) 需求实现 模型定义...odoo14\custom\estate\models\estate_property.py 需要继承mail.thread模型,并为需要追踪的字段设置tracking属性,并设置属性值为真值 #!.../usr/bin/env python # -*- coding: utf-8 -*- from odoo import models, fields, api class EstateProperty...,其定义文件为 odoo14\odoo\addons\mail\models\mail_thread.py,其字段命名均以message_开头 tracking 该属性为True或数字时,打开针对该属性所属字段的修改日志...,类型为models.AbstractModel,定义在文件 odoo14\odoo\addons\mail\models\mail_activity.py,其字段命名均以activity_,对应的,模型定义中
wizard可以通过关系字段(many2one或many2many)引用常规记录或wizard记录,但常规记录不能通过many2one字段引用wizard记录 详细代码 注意:为了更清楚的表达本文主题.../usr/bin/env python # -*- coding:utf-8 -*- import logging from odoo import models,fields,api from odoo.exceptions..., api from odoo.exceptions import UserError, ValidationError, MissingError _logger = logging.getLogger...可选 modelMethod 点击列表复选框时,需要调用的模型方法,通过该方法收集列表勾选记录的数据。可选。...binding_model_id和binding_view_types字段,如下: <record id="action_demo_wizard" model="ir.actions.act_window
模型之间的关系(Relations Between Models) 上一章介绍了为包含基本字段的模型创建自定义视图。然而,在任何真实的业务场景中,我们都需要不止一个模型。此外,模型之间的链接是必要的。...练习 添加房产标签表 创建estate.property.tag 模型和并添加以下字段: Field Type Attributes name Char required 添加菜单 添加 tag_ids...例如,我们通过partner_id字段,在测试模型上定义了到res.partner模型的链接。...首先,我们不需要所有模型的操作或菜单。某些模型只能通过另一个模型访问。在我们的练习中就是这样的:报价总是通过房产获得的。 其次,尽管property_id字段是必需的,但我们没有将其包含在视图中。...当我们通过one2many字段创建记录时,为了方便,会自动填充相应的many2one 添加odoo14\custom\estate\models\estate_property_offer.py #!
在这篇教程里我们将会了解到 Odoo 模型里的一些其他类型的字段和特殊机制,而我依然会继续带领大家一起完善我们的 Todo 应用,不断地往里面添加一些新的功能特性,让它看起来更丰满也更实用一些。...选择字段 在上一篇教程中,我们已经创建好了待办事项的模型,但是只是添加了「描述」和「已完成?」两个字段,这肯定是不能满足我们的需求的。...在上一篇教程中我们提到过,在对模型进行改动之后,需要对模块进行升级才能看到变更后的样子,除了从应用列表中找到模块进行升级外,我们还可以在命令行中给 Odoo 的启动命令加上参数 -u todo 指定升级...计算字段其实和其他字段一样,只不过多了一个 compute 属性,它的值是计算这个字段值的方法名。...deadline 这个字段的值(我们需要用它的值和当前时间进行比较),如果一个计算字段会用到多个其他字段的值,这里就需要以逗号分隔,将用到的值的字段名依次传入装饰器中。
当数据链接到视图时,我们将它们添加到views文件夹中 本章,我们将通过XML文件加载我们第一个action和菜单。Actions 和菜单为数据库中的标准记录。...这是因为,在odoo中加载CSV文件比加载XML文件更快。 odoo中,用户接口(action,菜单和视图)大部分是通过创建和组装XML文件中的记录来定义的。...Odoo有许多微调方式,但通常第一步是确保: 某些字段有默认值 某些字段只读 当记录重复时,某些字段不能被拷贝 在我们的房产业务案例中,我们希望:: 售价只读(往后将自动填充) 当记录重复时,可用日期和售价不能被拷贝..., default= lambda self: fields.Datetime.today()) 重启服务和并刷新浏览器界面验证 保留字段 参考: 主题相关文档可参考 保留字段名称. odoo为预定义行为保留了一些字段名称...当需要相关行为时,需要在模型中定义这些保留字段。 练习 -- 添加active字段 添加一个 active 字段到estate.property 模型。
binding_view_types 以逗号分隔的视图类型列表,即Action需要显示的上下文菜单所在的视图,主要是“列表”和“表单”。...默认为list,form(列表和表单) Window Actions (ir.actions.act_window) 最常见的动作类型,用于通过视图呈现模型的可视化:Window Action为模型定义了一组视图类型...包含字段: res_model action触发的要显示的视图关联的模型 views (view_id,view_type)对的列表。...所有这些类型都必须在生成的views列表中(至少有一个False view_id) view_ids M2M(技术上不是M2M:添加了一个sequence字段,可以只由一个视图类型组成,没有视图id)...注解:Act_window视图也可以通过ir.actions.Act_window.view干净地定义。
因此,控制器提供了自己的与模型的扩展机制: 通过继承Controller创建控制器。...通过 route()修饰的方法定义路由: class MyController(odoo.http.Controller): @route('/some_url', auth='public')...handler(self): do_before() return super(Extension, self).handler() 用route() 修饰是保持方法(和路由...", methods=['POST'], csrf=False, cors='*') def test_api(self, **kwargs): try:...主要由框架和认证模块使用。请求代码没有任何访问数据库的设施,也没有任何指示当前数据库或当前用户的配置。 methods – 此路由所应用的一系列http方法。如果未指定,则允许使用所有方法。
实践环境 Odoo 14.0-20221212 (Community Edition) 代码实现 在js脚本函数中调用模型中自定义方法: this....', // 模型中自定义名称 args: ['arg_value'] // 传递给模型方法参数列表,列表中每个元素对应模型方法的一个位置参数 }).then(function (res) { /.../usr/bin/env python # -*- coding:utf-8 -*- from odoo import models,fields,api class DemoWizard(models.TransientModel...): _name = 'demo.wizard' _description = 'demo wizard' #...此处代码已省略 @api.model...def action_select_records_via_checkbox(self, *args): '''通过wizard窗口界面复选框选取记录时触发的操作 @params
odoo菜单定义和修改学习总结 环境 odoo-14.0.post20221212.tar 定义菜单 方式1: 说明: id 菜单外部ID name 如果不指定name,则: 如果为菜单设置了action,则获取action record定义中name字段的值作为菜单name属性的值 如果未设置菜单action... groups 逗号分隔的res.groups模型的外部ID序列,形如groups="group_account_user,group_account_manager... 方式2:通过parent来设置菜单层级 <?xml version="1.0"?...将其model设置为"ir.ui.menu" 添加子元素 ,其中eval=False则表示隐藏,eval=True表示显示
在上一章中已经看到,odoo能够为给定模型生成默认视图。实际上,默认视图对于业务应用程序来说是不可接受的。相反,我们至少应该以逻辑的方式组织各个字段。 视图是在带有操作和菜单的XML文件中定义的。...在我们的estate模块中,我们需要以逻辑方式组织字段: 在列表(树)视图中,我们希望显示的不仅仅是名称。 在表单视图中,应该对字段进行分组。 在搜索视图中,我们必须能够搜索的不仅仅是名称。...表单用于创建和编辑单条件记录,其根元素为 ,由高层框架元素(group和notebook)和交互元素 (按钮和字段): ... <filter string="Archived" name="inactive" domain="[('active', '=', <em>False</em>...在<em>odoo</em>中,domain对记录上的条件进行编码:domain是用于选择<em>模型</em>记录子集的条件列表。每个条件都是一个包含<em>字段</em>名、运算符<em>和</em>值的三元组。
《Odoo10 Development Essentials》Chapter5(p106)中介绍了Odoo中分层关系的建立。 代码如下 在上面的代码中。 使用字段来关联上层记录。...使用和字段来进行记录所属层级,当时看书的时候对这些代码不是很理解,只是知道这样做能够提高层级关系数据模型查询数据记录的效率。...(如递归查询文件夹文件) Odoo中为了提高层次结构(树状结构)查询效率,每一条层级数据记录添加跟字段. 假设A是B的上级对象。那么存在这样的逻辑关系。...,获取每个产品目录各自的数值 注:这里可以发现,上层目录 添加数值 通过上面的展示,可以清楚的看到所有产品目录各自的包含结构。...凡事皆有两面,这种存储特性会在数据库中添加多余的字段。其实是以空间换时间。
领取专属 10元无门槛券
手把手带您无忧上云