宜兴通达竭诚为您服务。

ODOO12图书项目使用XML数据文件

2020-10-29 06:10:00     作者: Administrator     来源:互联网,版权归作者所有     浏览次数: 87     文字大小:【】【】【

你没有登录,文章中的图片无法正常显示,请点击登录

CSV 文件是一种展示数据方便简洁的格式,但 XML 文件更为强大,可在加载过程中提供更多的控制。比如,其文件名无需与所导入到的模型名称一致。因为XML格式通过文件内的XML元素可以提供更丰富的信息、更多的内容。

在前面的文章中我们已经使用过XML数据文件。视图和菜单项这类用户界面组件实际上都是存储在系统模型中的记录。模块中的XML文件是将这些记录加载到实例数据库的方式。我们将在library_app模块中添加一个数据文件data/book_demo.xml来作为展示,文件内容如下:

<?xml version="1.0"?>

<odoo noupdate="1">

<!-- Data to load -->

<record model="res.partner" id="res_partner_huxley">

<field name="name">Aldous Huxley</field>

</record>

<record model="library.book" id="library_book_bnw">

<field name="name">Brave New World</field>

<field name="author_ids"

eval="[(4, ref('res_partner_huxley'))]" />

<field name="date_published">1932-01-01</field>

</record>

</odoo>

老规矩,新的数据文件应在__manifest__.py中声明:

'demo': [

'data/res.partner.csv',

'data/library.book.csv',

'data/book_demo.xml',

],

类似 CSV 文件,该文件也会将数据加载到图书模型中。


XML文件包含一个外层<odoo>元素,内部可包含多个<record>元素与对应 CSV 数据行。

<record>元素有两个强制属性: model 和作为记录外部标识符的 id,每个字段使用一个<field>标签来进行写入。注意此处字段名内不可使用斜杠标记,如不可使用<field name=”publisher_id/id”>。应使用 ref 属性来引用外部标识符,一会儿就会讨论到关联 to-many 字段。

你可能注意到在外层元素中使用了noupdate=”1″属性。这防止了在模块升级时数据记录的载入,不至于在后续编辑中丢失数据。

noupdate 数据属性

升级模块时,会重新加载数据并重写模块记录。要谨记这可能意味着在升级模块时会重写任何对模块数据的手动更改。

这种重写行为是默认的,但可以修改有些数据仅在安装时导入,后续模块更新时则予以忽略,这正是通过<odoo>或<data>元素中的noupdate=”1″来实现的。

这对于需初始化配置且预期需自定义的数据来说非常有用,因为这些手动修改在模块更新时是安全的。例如在记录访问规则中经常使用,可以适应具体的实施需求。

在同一 XML 文件中可以有多个<data>版块。可通过这个来分隔仅需导入一次的数据(noupdate=”1″)和需在每次更新时重新导入的数据(noupdate=”0″)。noupdate=”0″是默认值,所以可以省略不写。注意还必须要有一个外层 XML 元素,就这个例子而言,使用两个<data>标签,并在外层包裹一个<odoo>或<data>元素。

noupdate标记存储在每条记录的外部标识符信息中。可通过技术菜单中的外部表单手动编辑,勾选不可更新复选框即可。


在 XML 中定义记录

在 XML 文件中,每个<record>元素有两个基本属性:id 和 model,并包含为对应列设置的值。 id 属性对应记录外部标识符,model 对应目标模型。<field>元素有几种分配值的方法,下面一起来看看。

直接为字段设置值

<field>元素的 name 属性标识要写入的字段。写入的值是元素内容:字段开、闭标签之间的文本。对于 date 和datetime,带有返回 date 或 datetime 对象表达式的 eval 属性可进行设置。返回的”YYYY-mm-dd”和”YYYY-mm-dd HH:MM:SS”字符串会进行转化。对于布尔字段,”0″ and “False”都会转换成 False,而任意非空值都会转换成 True。

通过表达式设置值

设置字段值更复杂的方式是通过 eval 属性,它会运行 Python 表达式并将结果分配给字段。表达式通过 Python 内置的以及一些其它可创建表达式标识符的上下文求值。

可使用如下 Python 模块来处理日期:time, datetime, timedelta和relativedelta。通过它们可以计算日期值,在演示和测试数据经常会用到,以让日期和模块安装日期较近。关于 Python 模块更多这类知识,请参考官方文档。

比如,把值设为前一天,可使用如下代码:

<field name="date_published"

eval="(datetime.now() + timedelta(-1))" />

求值上下文还可使用ref()函数,用于将外部标识符转换为对应的数据库 ID。这可用于为关联字段设置值。比如,可以使用它为publisher_id设置值:

<field name="publisher_id" eval="ref('res_partner_packt')" />

在 many-to-one 关联字段上设置值

对于many-to-one关联字段,要写入的是关联记录的数据库 ID。在 XML 文件中,我们一般会知道记录的XML ID,然后就需要把它转换成实际的数据库 ID。

一种方式是像前文那样使用带有 ref()函数的 eval 属性。更简单的替代方式是使用在元素中可用的ref 属性,使用它设置publisher_id many-to-one字段的值,我们可以这么写:

<field name="publisher_id" ref="res_partner_packt" />

在 to-many 关联字段上设置值

对于one-to-many和many-to-many字段,设置的不是单个 ID,而是一组关联 ID。并且还进行几种操作-我们可能需要将当前的关联记录列表替换成另外一个,或为其添加几次记录,甚至是删除其中的一些记录。

要让to-many字段支持写操作,我们要在 eval 属性中使用一种特殊的语法。我们使用一个元组组成的列表来写入to-many字段。每个元组有三个元素,构成一个写入命令,根据第一个元素中的代码进行对应操作。要重写图书作者列表,要使用如下代码:

<field name="author_ids"

eval="[(6, 0,

[ref('res_partner_alexandre'),

ref('res_partner_holger')]

)]"

/>

要往当前图书作者列表添加关联记录,需要添加如下代码:

<field name="author_ids"

eval="[(4, ref('res_partner_daniel'))]"

/>

上述的例子非常常见。这里仅使用了一个命令,但在外层列中可以串联多条命令。添加(4)和 替换(6)是最常用的命令。在进行添加(4)时,不需要使用最后一个元素,因此在以上代码中省略了。

完整的可用命令如下:

  • (0, _ , {‘field’: value})新建一条记录并将其与之关联

  • (1, id, {‘field’: value})更新已关联记录的值

  • (2, id, _)移除关联并删除 id 关联的记录

  • (3, id, _)移除关联但不删除 id 关联的记录。通常使用它来删除     many-to-many字段的关联记录

  • (4, id, _)关联已存在记录,仅适用于many-to-many字段

  • (5, _, _)删除所有关联,但不删除关联记录

  • (6, _, [ids])替换已关联记录列表为此处的列表

上述下划线_字符代表非关联值,通常填入 o 或 False。

常用模型的简写

如果回到前面,我们在 XML 中还发现<record>之外的元素,如<act_window>和<menuitem>。这些是常用模型的简写方式,是比常用的<record>更为简练的符号。它们用于向 base 模型加载数据、组成用户界面,在后面会作更详细的探讨。

为便于查看,以下是可用的简写元素以及加载数据的对应模型:

  • <act_window>是窗口操作模型ir.actions.act_window

  • <menuitem>是菜单项模型ir.ui.menu

  • <report>是报表操作模型ir.actions.report.xml

  • <template>是存储在ir.ui.view模型中的 QWeb 模板

应当注意在用于修改已有记录时,简写元素会覆盖所有字段。这与仅写入所提供字段的<record>基础元素不同。因此在需修改用户界面元素指定字段时,应使用<record>元素。

XML 文件中的其它操作

截至目前我们了解了如何使用 XML 文件添加和更新数据。但也可以通过 XML 文件删除数据以及执行指定模型方法。对更复杂的数据场景会非常有用。

删除记录

我们可以使用<delete>元素删除数据记录,使用 ID 或搜索域来定位要删除的记录。例如,使用搜索域查找记录并删除:

<delete

model="res.partner"

search="[('id','=',ref('library_app.res_partner_daniel'))]"

/>

如果知道要删除记录的具体 ID,可使用 id 属性。上例还可以写成这样:

<delete model="res.partner" id="library_app.res_partner_daniel" />

调用模型方法

XML 文件还可以通过<function>元素在加载过程中执行任意方法,可用于设定演示和测试数据。比如 Odoo 捆绑的 Notes 应用,使用它来设定演示数据:

<data noupdate="1">

<function

model="res.users"

name="_init_data_user_note_stages"

eval="[]" />

</data>

这会调用res.users模型中的_init_data_user_note_stages方法,不传任何参数。由参数列表eval传递,此处为空列表。

演示视频:
http://www.tderp.com/download/details/odoo12xml-868

http://ctdrive.tderp.com/file/13502532-468442237

相关文章 评论

服务原则及地区范围

宜兴通达团队,在企业网络维护和企业信息化建设与咨询方面,有10多年经验。

我团队愿与客户一道,力求彻底解决客户问题!
我们不是在给企业提供“头痛医头、脚痛医脚”的暂时解决方案,而是在部署根本性安全与稳定服务!!
我们愿携手客户,建立企业IT规划;杜绝随意安装系统、软件等操作;力求共同维护有序、安全、稳定的网络办公环境!!!
IT服务,服务是根本,客户是上帝;我们提供快速响应、快速上门、快速排查,提供优质高效的服务!!!!

通达团队提供全国范围内的服务,服务形式包括远程协助、电话咨询、电子邮件咨询、传真咨询、问答平台的问题解决等。

宜兴地区提供上门服务:

  • 市区服务:宜城街道、城北街道(屺亭街道)、新街街道、新庄街道、环科园、渚桥开发区
  • 市郊服务:张渚镇、西渚镇、太华镇、徐舍镇、官林镇、杨巷镇、新建镇、和桥镇、高塍镇、万石镇、周铁镇、芳桥镇、丁蜀镇、湖父镇。
  • 联系电话:189-21-343434
  • 在线沟通: