当前位置: 首页 > news >正文

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

在这里插入图片描述

一、Odoo模块结构基础

  1. 基本目录结构

    • 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文件来定义哪些用户组可以访问特定的模型和视图等。
  2. 模块的安装和升级

    • 安装:在Odoo的应用商店界面(如果是企业版)或者在开发者模式下的模块列表中,找到自定义模块并点击安装。Odoo会根据__manifest__.py文件中的依赖关系先安装依赖的模块,然后创建数据库表(基于模型定义),加载视图等数据。
    • 升级:当对模块进行修改后,如添加新的模型字段或者视图更改,升级模块时,Odoo会尝试根据修改的内容来更新数据库结构和视图等。例如,如果在模型中添加了一个新的字段,Odoo会在数据库表中添加对应的列。

二、模型开发(Model)

  1. 基础模型定义
    • 继承基础模型:在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')
      
  2. 模型关系定义
    • 一对多关系:例如,一个项目(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)

  1. 表单视图(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>
      
  2. 树视图(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>
      

四、业务逻辑开发

  1. 计算字段(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
      
  2. 约束条件(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自定义模块通常有一个特定的目录结构。一个典型的模块目录包含以下文件和文件夹&#xff1a; __init__.py&#xff1a;这是一个Python模块初始化文件。它使得该目录被视为一个Python模块。在这个文件中&#xff0c;你可以通过from. impo…...

Excel单元格中自适应填充多图

实例需求&#xff1a;在Excel插入图片时&#xff0c;由于图片尺寸各不相同&#xff0c;如果希望多个图片填充指定单元格&#xff0c;依靠用户手工调整&#xff0c;不仅费时费力&#xff0c;而且很难实现完全填充。如下图中的产品图册&#xff0c;有三个图片&#xff0c;如下图所…...

20.useMediaQuery

React useMediaQuery 钩子:如何优雅地实现响应式设计? 在现代 Web 开发中,响应式设计是一个关键概念,它允许应用根据不同的屏幕尺寸和设备特性调整其布局和行为。useMediaQuery 钩子提供了一种声明式的方法来在 React 组件中使用媒体查询,使得响应式逻辑的实现变得简单而…...

无人机场景 - 目标检测数据集 - 车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;无人机场景车辆检测数据集&#xff0c;真实场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如无人机场景城市道路行驶车辆图片、无人机场景城市道边停车车辆图片、无人机场景停车场车辆图片、无人机场景小区车辆图片、无人机场景车辆遮挡、车…...

聚合查询(查询)

count:统计表中所有的行数 指定某一列不统计NULL sum:求和 NULL值不参与计算&#xff08;省略&#xff09; avg()&#xff1a;对所有行的指定列求平均值 max&#xff08;&#xff09; min()&#xff1a;求所有指定行中最大值与最小值 分组查询 group by: ROUDN()小数点 havin…...

QT QLineEdit失去焦点事件问题与解决

本文介绍如何获得QLineEdit的失去焦点事件和获得焦点的输入框也会触发失去焦点事件的问题&#xff01; 目录 一、QLineEdit获得失去焦点事件 1.自定义类继承自QLineEdit 2.重写 focusOutEvent 3.使用 二、失去焦点事件问题 1.问题描述 2.问题解决 三、源码分享 lineed…...

Remora

Remora Remora 模型能够独立于碱基识别过程预测甲基化/修饰碱基的状态。Remora 仓库专注于准备修饰碱基训练数据和训练修饰碱基模型。此外,还提供了一些用于运行 Remora 模型和调查原始信号的功能。对于生产环境中的修饰碱基识别,建议使用 Dorado <https://github.com/na…...

MySQL中将一个字符串字段按层级树状展开

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 需求1.分析2.实现3.思路刨析表结构和数据 需求 数据库中有个字段如下 如何将其转换为如下形式&#xff1a; 1.分析 1.他的层级个数是不确定的&#xff0c;也就是说有的有2层有的有5…...

vue面试题8|[2024-11-14]

问题1&#xff1a;什么是渐进式框架? vue.js router vuex element ...插件 vue.js 渐0 router 渐1 vuex 渐2 vue.js只是一个核心库&#xff0c;比如我再添加一个router或者vuex&#xff0c;不断让项目壮大&#xff0c;就是渐进式框…...

ARM(安谋) China处理器

0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China&#xff0c;2018年4月established&#xff0c;独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1&#xff08;星辰处理器&#xff09; STAT-MC1&#xff0c;主要为满足AIOT应用性能、功…...

基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型

本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统&#xff0c;旨在通过技能匹配的方式对招聘信息进行分析与预测&#xff0c;帮助求职者根据自身技能找到最合适的职位&#xff0c;同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…...

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH&#xff08;广义自回归条件异方差&#xff09;模型计算VaR&#xff08;风险价值&#xff09;时&#xff0c;方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…...

深入Linux基础:文件系统与进程管理详解

在Linux运维领域&#xff0c;文件系统和进程管理是两个至关重要的基础知识。理解它们的原理和实际操作&#xff0c;不仅有助于我们更高效地管理服务器&#xff0c;还能快速定位问题、优化性能。本文将带你全面了解这两大模块&#xff0c;并配以示例代码进行讲解&#xff0c;帮助…...

缓存及其不一致

在实际开发过程中&#xff0c;一般都会遇到缓存&#xff0c;像本地缓存&#xff08;直接在程序里搞个map也可以&#xff0c;但是可能会随着数据的增长出现OOM&#xff0c;建议使用正经的本地缓存框架&#xff0c;因为自己实现淘汰策略啥的挺费劲的&#xff09;、分布式缓存&…...

Leetcode 有效的数独

这段代码解决的是 验证一个数独是否有效 的问题&#xff0c;其算法思想是基于 规则校验和状态记录。具体思想如下&#xff1a; 算法思想 核心目标&#xff1a; 检查每个数字在 同一行、同一列 和 同一个 3x3 子格 中是否重复。 状态记录&#xff1a; 使用 3 个布尔二维数组分别…...

《Java核心技术 卷I》用户界面中首选项API

首选项API 在桌面程序中&#xff0c;通常都会存储用户首选项&#xff0c;如用户最后处理的文件、窗口的最后位置等。 利用Properties类可以很容易的加载和保存程序的配置信息&#xff0c;但有以下缺点&#xff1a; 有些操作系统没有主目录概念&#xff0c;很难为匹配文件找到…...

Android 中的 Zygote 和 Copy-on-Write 机制详解

在 Android 系统中&#xff0c;Zygote 是一个关键的进程&#xff0c;几乎所有的应用进程都是通过它 fork&#xff08;派生&#xff09;出来的。通过 Zygote 启动新进程的方式带来了显著的性能优势&#xff0c;这得益于 fork 操作和 Linux 中的 Copy-on-Write&#xff08;COW&am…...

【人工智能】从零开始用Python实现逻辑回归模型:深入理解逻辑回归的原理与应用

解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 逻辑回归是一种经典的统计学习方法&#xff0c;用于分类问题尤其是二分类问题。它通过学习数据的特征和目标标签之间的…...

推荐一款功能强大的光学识别OCR软件:Readiris Dyslexic

Readiris Dyslexic是一款功能强大的光学识别OCR软件&#xff0c;可以扫描任何纸质文档并将其转换为完全可编辑的数字文件(Word&#xff0c;Excel&#xff0c;PDF)&#xff0c;然后用你喜欢的编辑器进行编辑。该软件提供了一种轻松创建&#xff0c;修改和签名PDF的完整解决方法&…...

Python爬虫----python爬虫基础

一、python爬虫基础-爬虫简介 1、现实生活中实际爬虫有哪些&#xff1f; 2、什么是网络爬虫&#xff1f; 3、什么是通用爬虫和聚焦爬虫&#xff1f; 4、为什么要用python写爬虫程序 5、环境和工具 二、python爬虫基础-http协议和chrome抓包工具 1、什么是http和https协议…...

css-50 Projects in 50 Days(3)

html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>旋转页面</title><link rel"sty…...

另外一种缓冲式图片组件的用法

文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理3. 示例代码4. 内容总结我们在上一章回中介绍了"FadeInImage组件"相关的内容,本章回中将介绍CachedNetworkImage组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的CachedNetwo…...

字节青训-小C的外卖超时判断、小C的排列询问

目录 一、小C的外卖超时判断 问题描述 测试样例 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终代码&#xff1a; 运行结果&#xff1a; 二、小C的排列询问 问题描述 测试样例 最终代码&#xff1a; 运行结果&#xff1a; ​编辑 一、小C的外卖超时判断…...

PHP 伪静态详解及实现方法

概述 在现代 Web 开发中&#xff0c;URL 的设计对用户体验和搜索引擎优化&#xff08;SEO&#xff09;至关重要。动态 URL 虽然功能强大&#xff0c;但往往显得冗长且不友好。伪静态&#xff08;URL 重写&#xff09;技术通过将动态 URL 转换为静态样式&#xff0c;不仅提高了…...

Spring Boot 简单预览PDF例子

目录 前言 一、引入依赖 二、使用步骤 1.创建 Controller 处理 PDF 生成和预览 2.创建预览页面 总结 前言 使用 Spring Boot 创建一个生成 PDF 并进行预览的项目&#xff0c;你可以按以下步骤进行。我们将使用 Spring Boot、Thymeleaf、iText 等技术来完成这个任务。 一、引入…...

【魔珐有言-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…...

LabVIEW 使用 Snippet

在 LabVIEW 中&#xff0c;Snippet&#xff08;代码片段&#xff09; 是一个非常有用的功能&#xff0c;它允许你将 一小段可重用的代码 保存为一个 图形化的代码片段&#xff0c;并能够在不同的 VI 中通过拖放来使用。 什么是 Snippet&#xff1f; Snippet 就是 LabVIEW 中的…...

单片机_day3_GPIO

目录 1. 灯如何才能亮 1.1原理图 1.2 二极管 1.3 换了一个灯和原理图 ​编辑 1.4 三极管 1.4.1 NPN型三极管 1.4.2 PNP型三极管 2. 基本概念 3. 输入 3.1 浮空输入 3.2 上拉输入 3.3 下拉输入 3.4 模拟输入 4. 输出 4.1 推挽输出 4.2 开漏输出 如何让开漏输出…...

Python小游戏24——小恐龙躲避游戏

首先&#xff0c;你需要安装Pygame库。如果你还没有安装&#xff0c;可以通过以下命令安装&#xff1a; 【bash】 pip install pygame 【python】代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen …...

Python 的多态笔记

Python的多态实际是通过instance 实现的 class Person:def __init__(self, name,age):self.name nameself.age agedef feed_pet(self,pet):#isinastance(obj,类)-->判断obj,是不是这个类的对象&#xff0c;或者判断obj是不是该类的子类的对象if isinstance(pet, Pet):sel…...