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 的代码字段

上一篇 odoo17开发教程(20):odoo js框架里的systray注册表和usermenu注册表详解_odoo owl systray-CSDN博客

下一篇 odoo17开发教程(22):eval的用法-CSDN博客

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值