odoo17开发教程(21):数据文件详解

Odoo 以数据为导向,因此模块定义的一个重要部分就是其管理的各种记录的定义:用户界面(菜单和视图)、安全性(访问权限和记录规则)、报告和普通数据都是通过记录定义的。

结构

在 Odoo 中定义数据的主要方式是通过 XML 数据文件:XML 数据文件的大致结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- the root elements of the data file -->
<odoo><operation/>...
</odoo>

root根元素里可以包含任意多的子操作。

数据文件按顺序执行,操作只能引用之前定义的操作结果

如果数据文件的内容只需要执行一次,您可以指定 odoo 标志 noupdate 设置为 1。您可以将这部分文件放在 <data noupdate="1"> 域中。

<odoo><data noupdate="1"><!-- 只在安装模块的时候加载一次 --><operation/></data><!-- 在安装和更新模块时都会重新加载 --><operation/>
</odoo>

核心操作

record

记录定义或更新数据库记录,它具有以下属性:

  • model (required) 要创建(或更新)的模型名称
  • id 该记录的外部标识符external identifier。强烈建议提供一个 (在创建记录时,允许后续定义修改或引用该记录,修改记录时也需要引用这个id
  • context 创建记录时使用的上下文

  • forcecreate 在更新模式下,如果记录不存在,是否应创建该记录, 需要外部标识符,默认值为True

field 

每条记录都可以由字段标组成,定义创建记录时要设置的值。没有字段的记录将使用所有默认值(创建)或不做任何操作(更新)。

一个字段有一个强制的 name 属性、要设置的字段名称以及定义值本身的各种方法:

如果未为字段提供值,则会在该字段上设置隐式 False。可用于清除字段,或避免使用字段的默认值。

search

对于关系字段,应该是字段模型上的一个域domain。

查询条件,并将查询结果设置为字段值。如果字段是 Many2one,则只使用第一个结果。

ref

如果提供 ref 属性,其值必须是一个有效的外部 ID,该 ID 将被查找并设置为字段的值。

主要用于 Many2one 和 Reference 字段

type

如果提供了 type 属性,它将用于解释和转换字段内容。字段内容可以通过使用 file 属性的外部文件提供,也可以通过节点的正文提供。

type的有效值如下:xmlhtml,file, char, base64, int, float, listtuple

eval

在前几种方法都不适用的情况下,eval 属性可以简单地对所提供的 Python 表达式进行求值,并将结果设置为字段的值。

context默认包含一下python模块timedatetimetimedeltarelativedelta

下一篇文章讲详解eval的用法。

delete 

删除标记可以删除任意数量的先前定义的记录。它具有以下属性:

model(必填)
应删除指定记录的模型

id
要删除记录的外部 id

search
用于查找要删除的模型记录的域

id 和 search 是排他的,不能同时使用

function

函数标签使用提供的参数在模型上调用一个方法。它有两个必选参数 model 和 name,分别指定要调用的模型和方法名称。

提供参数时,可以使用 eval(应求值为调用方法的参数序列)或值元素(见列表值)。

<odoo><data noupdate="1"><record name="partner_1" model="res.partner"><field name="name">Odude</field></record><function model="res.partner" name="send_inscription_notice"eval="[[ref('partner_1'), ref('partner_2')]]"/><function model="res.users" name="send_vip_inscription_notice"><function eval="[[('vip','=',True)]]" model="res.partner" name="search"/></function></data><record id="model_form_view" model="ir.ui.view">...</record>
</odoo>

捷径Shortcuts

由于 Odoo 的一些重要结构模型非常复杂且涉及面广,因此数据文件提供了比使用记录标记更简短的定义方式:

menuitem

定义一个 ir.ui.menu 记录,其中包含一系列默认设置和回退:

parent
如果设置了父属性,它应该是其他菜单项的外部 id,用作新项目的父属性

如果没有提供父属性,则会尝试将 name 属性解释为菜单名称的/分隔序列,并在菜单层次结构中查找位置。在这种解释中,会自动创建中间菜单

否则,菜单将被定义为 "顶层 "菜单项(不是无父菜单)

name
如果没有指定 name 属性,则会尝试从链接操作(如果有)中获取菜单名称。否则将使用记录的 id

groups
groups 属性被解释为以逗号分隔的 res.groups 模型外部标识符序列。如果外部标识符前缀为减号(-),则该组将从菜单的组中删除

action
如果指定,action 属性应是打开菜单时要执行的操作的外部 id

id
菜单项的外部 id

template

创建 QWeb 视图,只需要视图的框架部分,并允许使用一些可选属性:

id
视图的外部标识符

name、inherit_id、priority
与 ir.ui.view 中的相应字段相同(注:herit_id 应为外部标识符)

primary
如果设置为 "true "并与 inherit_id 结合使用,则将视图定义为主视图

groups
用逗号分隔的组外部标识符列表

page
如果设置为 "True",则模板为网站页面(可链接到,可删除)

optional
启用enabled或禁用disabled,视图是否可以被禁用(在网站界面中)及其默认状态。如果未设置,则视图始终处于启用状态。

CSV 数据文件

XML 数据文件具有灵活性和自描述性,但在批量创建同一模型的大量简单记录时却非常冗长。

在这种情况下,数据文件也可以使用 csv,这通常是用来设置访问权限:

  • 文件名为 model_name.csv
  • 第一行列出要写入的字段,特殊字段 id 用于外部标识符(用于创建或更新)
  • 此后每一行都会创建一条新记录

下面是定义国家状态的数据文件 res.country.state.csv 的第一行

 

"id","country_id:id","name","code"
state_au_1,au,"Australian Capital Territory","ACT"
state_au_2,au,"New South Wales","NSW"
state_au_3,au,"Northern Territory","NT"
state_au_4,au,"Queensland","QLD"
state_au_5,au,"South Australia","SA"
state_au_6,au,"Tasmania","TAS"
state_au_7,au,"Victoria","VIC"
state_au_8,au,"Western Australia","WA"
state_us_1,us,"Alabama","AL"
state_us_2,us,"Alaska","AK"
state_us_3,us,"Arizona","AZ"
state_us_4,us,"Arkansas","AR"
state_us_5,us,"California","CA"
state_us_6,us,"Colorado","CO"

以更易读的格式呈现:

id

country_id:id

name

code

state_au_1

au

Australian Capital Territory

ACT

state_au_2

au

New South Wales

NSW

state_au_3

au

Northern Territory

NT

state_au_4

au

Queensland

QLD

state_au_5

au

South Australia

SA

state_au_6

au

Tasmania

TAS

state_au_7

au

Victoria

VIC

state_au_8

au

Western Australia

WA

state_us_1

us

Alabama

AL

state_us_2

us

Alaska

AK

state_us_3

us

Arizona

AZ

state_us_4

us

Arkansas

AR

state_us_5

us

California

CA

state_us_6

us

Colorado

CO

对于每一行(记录):

  • 第一列是要创建或更新的记录的外部 ID
  • 第二列是要链接到的国家对象的外部 ID(国家对象必须事先定义好)
  • 第三列是 res.country.state 的名称字段
  • 第四列是 res.country.state 的代码字段

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++ 哈希应用】

文章目录 位图概念代码实现海量数据处理 布隆过滤器概念代码实现海量数据处理 哈希切割海量数据处理 位图 概念 一个值在给定的集合中有两种状态&#xff0c;在或不在&#xff0c;要表示这种状态&#xff0c;最少可以用一个比特位&#xff0c;比特位为1表示在&#xff0c;比特…

【简单介绍下单片机】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

大学生简历大赛演讲稿(6篇)

大学生简历大赛演讲稿&#xff08;6篇&#xff09; 以下是六篇大学生简历大赛演讲稿的范文&#xff0c;供您参考&#xff1a; 范文一&#xff1a;展现真我&#xff0c;点亮未来 尊敬的评委、亲爱的同学们&#xff1a; 大家好&#xff01; 今天&#xff0c;我站在这里&#xf…

open-webui与ollama的部署最后完整之命令

docker run -d --networkhost -v open-webui:/app/backend/data -e HF_ENDPOINThttps://hf-mirror.com -e OLLAMA_BASE_URLhttp://127.0.0.1:11434 --name open-webui --restart always ghcr.io/open-webui/open-webui:main -e HF_ENDPOINThttps://hf-mirror.com 一定要加上&a…

【C++】:C++关键字,命名空间,输入输出,缺省参数

目录 一&#xff0c;C关键字(C98)二&#xff0c;命名空间2.1 命名冲突2.2 关键字namespace2.2.1 命名空间中可以定义变量/函数/类型2.2.2 命名空间可以嵌套2.2.3 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。 2.3 命名空间的使用2.3.1 指定…

剑指offer之牛客与力扣——前者分类题单中的题目在后者的链接

搜索 [4.12完成] JZ1 LCR 172. 统计目标成绩的出现次数 JZ3 153. 寻找旋转排序数组中的最小值 JZ4 LCR 014. 字符串的排列 JZ5 LCR 163. 找到第 k 位数字 400 动态规划 [4.15完成] JZ2 LCR 161. 连续天数的最高销售额 53 JZ3 LCR 127. 跳跃训练 70 JZ4 LCR 126. 斐波那契…

笔记:编写函数,接收整数参数t,返回斐波那契数列中大于t的第1个数。

文章目录 前言一、斐波那契数列是什么&#xff1f;二、编写代码1.代码2.优化代码 总结 前言 题目&#xff1a;编写函数&#xff0c;接收整数参数t&#xff0c;返回斐波那契数列中大于t的第1个数。 在编写函数之前&#xff0c;我们首先需要了解一下斐波那契数列是什么。 一、斐…

gemini国内怎么用

gemini国内怎么用 Google Gemini 作为一个尚处于研发阶段的大型语言模型&#xff0c;其具体功能和性能尚未公开&#xff0c;因此无法对其好用程度做出明确评价。 然而&#xff0c;基于 Google 在人工智能领域的领先地位和技术实力&#xff0c;我们可以对其潜力进行一些推测&a…

【xgboost】使用xgboost训练一个简单模型

使用pandas读取特征数据&#xff0c;并处理数据中的双引号 使用xgboost训练一版模型 xgboost1.6.2 #!/usr/bin/env python # -*- coding:utf-8 -*- import pandas as pd import numpy as np from sklearn.model_selection import train_test_split import xgboost as xgb impor…

你不知道的JavaScript---深入理解 JavaScript 中的 this 关键字

你好&#xff0c;我是小白Coding日志&#xff0c;一个热爱技术的程序员。在这里&#xff0c;我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客&#xff0c;一起在技术的世界里探索前行吧&#xff01; 在 JavaScript …

大型网站系统架构演化实例_4.数据库读写分离

1.数据库读写分离 网站在使用缓存后&#xff0c;使对大部分数据读操作访问都可以不通过数据库就能完成&#xff0c;但是仍有一部分操作&#xff08;缓存访问不命中、缓存过期&#xff09;和全部的写操作都需要访问数据库&#xff0c;在网站的用户达到一定规模后&#x…

Dockerfile CMD、ENTRYPOINT 区别

ENTRYPOINT与CMD都可以对iamge配置启动命令。但两者之间还是有一些细微的区别。多数情况下需要用户在二者中选择其一使用&#xff0c;但也可以共同使用两者。下面将具体分析二者不同的使用场景。 ENTRYPOINT or CMD 最终&#xff0c;ENTRYPOINT与CMD都提供了一个方法&#xff0…

通过实例学C#之ArrayList

介绍 ArrayList对象可以容纳若干个具有相同类型的对象&#xff0c;那有人说&#xff0c;这和数组有什么区别呢。其区别大概可以分为以下几点&#xff1a; 1.数组效率较高&#xff0c;但其容量固定&#xff0c;而且没办法动态改变。 2.ArrayList容量可以动态增长&#xff0c;但…

ros1中python3包调用自定义.py文件

ros中python包相互import不成功问题 问题解决办法 问题 在ros工程中&#xff0c;运行python文件难以直接import自己写的py文件&#xff0c;相互之间无法import&#xff0c;但是在python3虚拟环境python *.py文件就可以正常运行&#xff01; 注意这里还有个问题&#xff0c;我…

❤️‍FlyFlow工作流周更来咯~~

FlyFlow 借鉴了钉钉与飞书的界面设计理念&#xff0c;致力于打造一款用户友好、快速上手的工作流程工具。相较于传统的基于 BPMN.js 的工作流引擎&#xff0c;我们提供的解决方案显著简化了操作逻辑&#xff0c;使得用户能够在极短的时间内构建定制化的业务流程&#xff0c;即便…

前端近7天,近半个月,近1个月,近1年的日期处理

前端如何获取近7天,近1年的日期进行查询? methods:{//近7天getRangeDate(ranges) {let nowDays new Date();let getYear nowDays.getFullYear();let getMonth nowDays.getMonth() 1;let getDate nowDays.getDate();let nd new Date();nd nd.valueOf();nd nd - ranges…

记录汇川:五个ST案例

起保停&#xff1a; 简单数学教学&#xff1a; 数据查找&#xff1a; 按钮检测&#xff1a; 数据堆栈&#xff1a;

【k8s】:kubectl 命令设置简写启用自动补全功能

【k8s】:kubectl 命令设置简写&启用自动补全功能 1、设置kubectl命令简写2、启用kubectl自动补全功能💖The Begin💖点点关注,收藏不迷路💖 Kubernetes(K8s)是一个强大的容器编排平台,而kubectl则是与之交互的命令行工具。尽管Kubernetes提供了强大的功能,但有时…

wiringpi库的应用 -- sg90 定时器 oled

sg 90舵机: 接线: VCC -- 红 GND -- 地 信号线 -- 黄 -- pwm 定时器: 先玩定时器: sg90 需要的pwm波需要定时器输出&#xff0c;so我们得先来玩一下定时器 分析&#xff1a;实现定时器&#xff0c;通过itimerval结构体以及函数setitimer产生的信号&#xff0c;系统…

python装饰器系列教程(1)

若为了与用户交互&#xff0c;有如下代码 def messageOne():print("今天天气是晴转多云")def messageTwo():print("今天的空气质量为优")messageOne() messageTwo()现需在每条提示信息之前加上一条关于客户来自中国的信息&#xff0c;可改写为 def messa…