赞
踩
入新公司第二天,新接触odoo框架,项目采用的是14-15版本(据说最新16有一定区别)
组内大佬提供odoo源码文件夹含义:
odoo框架采用ORM和xml
个人理解:
代码的基本单位是模块(如 class xxx(models.Model):),模块分为两种,一种是数据库表的映射,与数据库表完全对应(或者说数据库就是根据这种模块建表的),odoo框架配置好后,运行会自动生成配置的数据库和与其模块对应的实体表;另一种模块是前端的展现,无与之完全对应的实体表存在,是多个表统一计算合并的结果,与最终画面的呈现对应,只在运行中生成实例,并不会持久化数据。
模块是odoo处理数据在代码中的体现,以类的形式存在,本质上就是被代码包装的表数据结构。
在Odoo中,模块被加载到环境中的过程可以分为以下几个步骤:
模块的声明:首先,你需要在Odoo的配置文件中声明要加载的模块。在配置文件中,你可以指定要加载的模块的路径,以及加载的顺序。配置文件通常是odoo.conf
。
模块的发现:Odoo会通过扫描模块路径来发现所有可用的模块。模块路径可以在配置文件中指定,也可以通过命令行参数传递给Odoo。
模块的依赖解析:Odoo会解析每个模块的__manifest__.py
文件,该文件描述了模块的元数据和依赖关系。Odoo会根据依赖关系的定义,确定模块加载的顺序。
模块的注册:一旦依赖关系被解析,Odoo会将模块注册到环境中。注册过程会创建模块相关的数据库表,并将模块的数据结构添加到数据库中。
模块的安装:一旦模块被注册到环境中,你可以选择安装模块。安装模块会执行模块的安装脚本,该脚本可以用来创建默认数据、配置权限等。
模块的加载:一旦模块被安装,它就可以被加载到环境中。加载模块会将模块的代码加载到内存中,使其可以被其他模块或用户访问和使用。
应用是功能集成的基本单位,整个odoo框架相当于一个appstore,每个应用是一个app,在框架运行的网站中可以选择启用某个应用,然后就可以运行该应用的网页表单等。xml是odoo框架实现其网页展现的核心,个人认为也是他性能差的原因之一。xml里定义了应用网页的展现,一个应用的主菜单、子菜单,各个子菜单的数据展示、数据编辑、查询预设条件等都在xml里设置。
odoo的语法命名和常规语言不太符合,性能堪忧,设计让人无语,如:
模块中的某项元素在代码中的引用是用'name',在xml中建立对应的联系需要取他的name值,单个元素(或者说列名)在画面中的显示是string。但是视图中,画面和菜单的显示值为name,联系标识是id:
- # -*- coding: UTF-8 -*-
-
- # 框架引用
- from odoo import api, fields, models
-
-
- class ExampleModel(models.Model):
- _name = 'example.model' #模块标识
- _description = '随便写' #描述
-
- # 具备属性/页面显示限制
- value = fields.Char(string='值')
- note = fields.Text(string='说明', default='说明信息')
- <?xml version="1.0" encoding="UTF-8"?>
- <odoo>
- <!-- Tree视图重写,model固定为:ir.ui.view-->
- <record id="example_tree_view" model="ir.ui.view">
- <field name="name">tree视图</field>
- <!-- model引用:class:ExampleModel的_name -->
- <field name="model">example.model</field>
- <!-- arch下代码是操作的 -->
- <field name="arch" type="xml">
- <tree>
- <!-- 取模块的元素的name -->
- <field name="value" width="100px" />
- <field name="note" width="100px" />
- </field>
- </record>
-
- <!-- 默认视图,model固定为:ir.actions.act_window -->
- <record id="example_act_window" model="ir.actions.act_window">
- <field name="name">默认视图</field>
- <field name="res_model">example.model</field>
- <field name="view_mode">tree,form,search</field>
- </record>
-
- <!-- 主菜单按钮 -->
- <menuitem name="主菜单按钮"
- id="main_menu"
- groups=""
- sequence="10" />
-
- <!-- 子菜单按钮,画面取视图id -->
- <menuitem name="子菜单按钮"
- id="list_menu"
- parent="main_menu"
- action="example_act_window"
- sequence="10" />
- </odoo>

以上代码经修改,仅供参考。
odoo框架的其他总结:
1、代码更新到网站需要重启服务(代码重编译,非热更新)
2、xml更新到网页只需要在网页上点应用升级(静态文件读取到数据库,及其卡)
3、model里对一对多的单选等限制不是绝对的(应该是需要额外设置)
4、框架自带env对象,多态的实现为内存中以key-value形式保存最后一次重写的方法,即可直接继承重写无需修改调用父类方法
5、更新数据不支持map表等方式批量修改,只能一条一条改,入库也不支持批量入库,也是一条一条入库。修改数据时遇到one2many的表需要无脑for循环,效率极低
生活不易, 承接程序和各类论文辅导, 中英, java-python-vue-react..等等, 一帮大厂在职兄弟承包各种类型语言和程序, 详情+v
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。