ODOO学习笔记(12):自定义模块开发

一、Odoo模块结构基础
-
基本目录结构
- Odoo自定义模块通常有一个特定的目录结构。一个典型的模块目录包含以下文件和文件夹:
__init__.py:这是一个Python模块初始化文件。它使得该目录被视为一个Python模块。在这个文件中,你可以通过from. import <python_file_name>的方式导入模块中的其他Python文件。__manifest__.py:这是模块的清单文件,用于定义模块的基本信息,如模块名称、版本、作者、依赖关系等。例如:{'name': 'My Custom Module','version': '1.0','author': 'Your Name','category': 'Uncategorized','description': """This is a custom module developed for specific business needs.""",'depends': ['base'], # 依赖基础模块'data': [# 在这里可以添加视图文件等数据文件的路径],'qweb': [# 添加QWeb模板文件路径] }models文件夹:用于存放模型(Model)相关的Python文件。模型定义了数据库中的表结构以及业务逻辑。例如,一个简单的自定义模型文件my_model.py可能如下:from odoo import models, fields, apiclass MyModel(models.Model):_name ='my.model'name = fields.Char(string='Name')views文件夹:包含视图(View)相关的XML文件。视图用于定义用户界面,如表单视图、树视图等。一个简单的表单视图文件my_view.xml可以是这样:<?xml version="1.0" encoding="UTF - 8"?> <odoo><record id="view_my_model_form_inherit" model="ir.ui.view"><field name="name">my.model.form.inherit</field><field name="model">my.model</field><field name="arch" type="xml"><form string="My Model Form"><field name="name"/></form></field></record> </odoo>security文件夹:用于定义安全相关的规则,如访问控制列表(ACL)。可以通过XML文件来定义哪些用户组可以访问特定的模型和视图等。
- Odoo自定义模块通常有一个特定的目录结构。一个典型的模块目录包含以下文件和文件夹:
-
模块的安装和升级
- 安装:在Odoo的应用商店界面(如果是企业版)或者在开发者模式下的模块列表中,找到自定义模块并点击安装。Odoo会根据
__manifest__.py文件中的依赖关系先安装依赖的模块,然后创建数据库表(基于模型定义),加载视图等数据。 - 升级:当对模块进行修改后,如添加新的模型字段或者视图更改,升级模块时,Odoo会尝试根据修改的内容来更新数据库结构和视图等。例如,如果在模型中添加了一个新的字段,Odoo会在数据库表中添加对应的列。
- 安装:在Odoo的应用商店界面(如果是企业版)或者在开发者模式下的模块列表中,找到自定义模块并点击安装。Odoo会根据
二、模型开发(Model)
- 基础模型定义
- 继承基础模型:在Odoo中,很多时候我们会继承已有的模型来扩展功能。例如,继承
res.partner(合作伙伴模型)来添加自定义字段。from odoo import models, fields, apiclass ResPartnerCustom(models.Model):_inherit ='res.partner'custom_field = fields.Char(string='Custom Field') - 全新模型创建:定义新的模型,如创建一个任务管理模块的任务模型。
class Task(models.Model):_name = 'task.management.task'name = fields.Char(string='Task Name')description = fields.Text(string='Description')due_date = fields.Date(string='Due Date')
- 继承基础模型:在Odoo中,很多时候我们会继承已有的模型来扩展功能。例如,继承
- 模型关系定义
- 一对多关系:例如,一个项目(
project.project)可以有多个任务(task.management.task)。在任务模型中可以这样定义:class Task(models.Model):_name = 'task.management.task'#... 其他字段project_id = fields.Many2one('project.project', string='Project') - 多对多关系:假设员工(
hr.employee)可以属于多个项目团队,在员工模型中可以定义如下:class Employee(models.Model):_name = 'hr.employee'#... 其他字段project_team_ids = fields.Many2many('project.project.team', string='Project Teams')
- 一对多关系:例如,一个项目(
三、视图开发(View)
- 表单视图(Form View)
- 基本表单视图:用于显示和编辑单个记录。例如,一个简单的任务表单视图。
<?xml version="1.0" encoding="UTF - 8"?> <odoo><record id="view_task_form" model="ir.ui.view"><field name="name">task.management.task.form</field><field name="model">task.management.task</field><field name="arch" type="xml"><form string="Task Form"><sheet><group><field name="name"/><field name="description"/><field name="due_date"/></group></sheet></form></field></record> </odoo> - 视图继承:可以继承已有的视图来添加或修改字段显示。例如,继承上面的任务表单视图来添加一个新字段。
<?xml version="1.0" encoding="UTF - 8"?> <odoo><record id="view_task_form_inherit" model="ir.ui.view"><field name="name">task.management.task.form.inherit</field><field name="model">task.management.task</field><field name="inherit_id" ref="module_name.view_task_form"/><field name="arch" type="xml"><field name="sheet" position="inside"><field name="new_field"/></field></field></record> </odoo>
- 基本表单视图:用于显示和编辑单个记录。例如,一个简单的任务表单视图。
- 树视图(Tree View)
- 树视图用于显示多个记录的列表。例如,一个任务列表树视图。
<?xml version="1.0" encoding="UTF - 8"?> <odoo><record id="view_task_tree" model="ir.ui.view"><field name="name">task.management.task.tree</field><field name="model">task.management.task</field><field name="arch" type="xml"><tree string="Task List"><field name="name"/><field name="due_date"/></tree></field></record> </odoo>
- 树视图用于显示多个记录的列表。例如,一个任务列表树视图。
四、业务逻辑开发
- 计算字段(Computed Field)
- 计算字段的值是根据其他字段的值通过一定的计算规则得到的。例如,在任务模型中计算任务的剩余天数。
from odoo import models, fields, apiclass Task(models.Model):_name = 'task.management.task'#... 其他字段due_date = fields.Date(string='Due Date')today_date = fields.Date(string='Today Date', default=fields.Date.today)remaining_days = fields.Integer(string='Remaining Days', compute='_compute_remaining_days')@api.depends('due_date', 'today_date')def _compute_remaining_days(self):for task in self:if task.due_date:task.remaining_days=(task.due_date - task.today_date).dayselse:task.remaining_days = 0
- 计算字段的值是根据其他字段的值通过一定的计算规则得到的。例如,在任务模型中计算任务的剩余天数。
- 约束条件(Constraints)
- 可以在模型中定义约束条件来确保数据的合法性。例如,确保任务的截止日期大于当前日期。
from odoo import models, fields, api from odoo.exceptions import ValidationErrorclass Task(models.Model):_name = 'task.management.task'#... 其他字段due_date = fields.Date(string='Due Date')@api.constrains('due_date')def _check_due_date(self):for task in self:if task.due_date and task.due_date < fields.Date.today():raise ValidationError("Due date must be greater than or equal to today's date.")
- 可以在模型中定义约束条件来确保数据的合法性。例如,确保任务的截止日期大于当前日期。
相关文章:
ODOO学习笔记(12):自定义模块开发
一、Odoo模块结构基础 基本目录结构 Odoo自定义模块通常有一个特定的目录结构。一个典型的模块目录包含以下文件和文件夹: __init__.py:这是一个Python模块初始化文件。它使得该目录被视为一个Python模块。在这个文件中,你可以通过from. impo…...
Excel单元格中自适应填充多图
实例需求:在Excel插入图片时,由于图片尺寸各不相同,如果希望多个图片填充指定单元格,依靠用户手工调整,不仅费时费力,而且很难实现完全填充。如下图中的产品图册,有三个图片,如下图所…...
20.useMediaQuery
React useMediaQuery 钩子:如何优雅地实现响应式设计? 在现代 Web 开发中,响应式设计是一个关键概念,它允许应用根据不同的屏幕尺寸和设备特性调整其布局和行为。useMediaQuery 钩子提供了一种声明式的方法来在 React 组件中使用媒体查询,使得响应式逻辑的实现变得简单而…...
无人机场景 - 目标检测数据集 - 车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」
数据集介绍:无人机场景车辆检测数据集,真实场景高质量图片数据,涉及场景丰富,比如无人机场景城市道路行驶车辆图片、无人机场景城市道边停车车辆图片、无人机场景停车场车辆图片、无人机场景小区车辆图片、无人机场景车辆遮挡、车…...
聚合查询(查询)
count:统计表中所有的行数 指定某一列不统计NULL sum:求和 NULL值不参与计算(省略) avg():对所有行的指定列求平均值 max() min():求所有指定行中最大值与最小值 分组查询 group by: ROUDN()小数点 havin…...
QT QLineEdit失去焦点事件问题与解决
本文介绍如何获得QLineEdit的失去焦点事件和获得焦点的输入框也会触发失去焦点事件的问题! 目录 一、QLineEdit获得失去焦点事件 1.自定义类继承自QLineEdit 2.重写 focusOutEvent 3.使用 二、失去焦点事件问题 1.问题描述 2.问题解决 三、源码分享 lineed…...
Remora
Remora Remora 模型能够独立于碱基识别过程预测甲基化/修饰碱基的状态。Remora 仓库专注于准备修饰碱基训练数据和训练修饰碱基模型。此外,还提供了一些用于运行 Remora 模型和调查原始信号的功能。对于生产环境中的修饰碱基识别,建议使用 Dorado <https://github.com/na…...
MySQL中将一个字符串字段按层级树状展开
水善利万物而不争,处众人之所恶,故几于道💦 文章目录 需求1.分析2.实现3.思路刨析表结构和数据 需求 数据库中有个字段如下 如何将其转换为如下形式: 1.分析 1.他的层级个数是不确定的,也就是说有的有2层有的有5…...
vue面试题8|[2024-11-14]
问题1:什么是渐进式框架? vue.js router vuex element ...插件 vue.js 渐0 router 渐1 vuex 渐2 vue.js只是一个核心库,比如我再添加一个router或者vuex,不断让项目壮大,就是渐进式框…...
ARM(安谋) China处理器
0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China,2018年4月established,独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1(星辰处理器) STAT-MC1,主要为满足AIOT应用性能、功…...
基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型
本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统,旨在通过技能匹配的方式对招聘信息进行分析与预测,帮助求职者根据自身技能找到最合适的职位,同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…...
MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)
MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH(广义自回归条件异方差)模型计算VaR(风险价值)时,方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…...
深入Linux基础:文件系统与进程管理详解
在Linux运维领域,文件系统和进程管理是两个至关重要的基础知识。理解它们的原理和实际操作,不仅有助于我们更高效地管理服务器,还能快速定位问题、优化性能。本文将带你全面了解这两大模块,并配以示例代码进行讲解,帮助…...
缓存及其不一致
在实际开发过程中,一般都会遇到缓存,像本地缓存(直接在程序里搞个map也可以,但是可能会随着数据的增长出现OOM,建议使用正经的本地缓存框架,因为自己实现淘汰策略啥的挺费劲的)、分布式缓存&…...
Leetcode 有效的数独
这段代码解决的是 验证一个数独是否有效 的问题,其算法思想是基于 规则校验和状态记录。具体思想如下: 算法思想 核心目标: 检查每个数字在 同一行、同一列 和 同一个 3x3 子格 中是否重复。 状态记录: 使用 3 个布尔二维数组分别…...
《Java核心技术 卷I》用户界面中首选项API
首选项API 在桌面程序中,通常都会存储用户首选项,如用户最后处理的文件、窗口的最后位置等。 利用Properties类可以很容易的加载和保存程序的配置信息,但有以下缺点: 有些操作系统没有主目录概念,很难为匹配文件找到…...
Android 中的 Zygote 和 Copy-on-Write 机制详解
在 Android 系统中,Zygote 是一个关键的进程,几乎所有的应用进程都是通过它 fork(派生)出来的。通过 Zygote 启动新进程的方式带来了显著的性能优势,这得益于 fork 操作和 Linux 中的 Copy-on-Write(COW&am…...
【人工智能】从零开始用Python实现逻辑回归模型:深入理解逻辑回归的原理与应用
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 逻辑回归是一种经典的统计学习方法,用于分类问题尤其是二分类问题。它通过学习数据的特征和目标标签之间的…...
推荐一款功能强大的光学识别OCR软件:Readiris Dyslexic
Readiris Dyslexic是一款功能强大的光学识别OCR软件,可以扫描任何纸质文档并将其转换为完全可编辑的数字文件(Word,Excel,PDF),然后用你喜欢的编辑器进行编辑。该软件提供了一种轻松创建,修改和签名PDF的完整解决方法&…...
Python爬虫----python爬虫基础
一、python爬虫基础-爬虫简介 1、现实生活中实际爬虫有哪些? 2、什么是网络爬虫? 3、什么是通用爬虫和聚焦爬虫? 4、为什么要用python写爬虫程序 5、环境和工具 二、python爬虫基础-http协议和chrome抓包工具 1、什么是http和https协议…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
