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

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文件包含一个外层元素,内部可包含多个元素与对应 CSV 数据行。
元素有两个强制属性: model 和作为记录外部标识符的 id,每个字段使用一个标签来进行写入。注意此处字段名内不可使用斜杠标记,如不可使用。应使用 ref 属性来引用外部标识符,一会儿就会讨论到关联 to-many 字段。
你可能注意到在外层元素中使用了noupdate=”1″属性。这防止了在模块升级时数据记录的载入,不至于在后续编辑中丢失数据。
noupdate 数据属性
升级模块时,会重新加载数据并重写模块记录。要谨记这可能意味着在升级模块时会重写任何对模块数据的手动更改。
这种重写行为是默认的,但可以修改有些数据仅在安装时导入,后续模块更新时则予以忽略,这正是通过或元素中的noupdate=”1″来实现的。
这对于需初始化配置且预期需自定义的数据来说非常有用,因为这些手动修改在模块更新时是安全的。例如在记录访问规则中经常使用,可以适应具体的实施需求。
在同一 XML 文件中可以有多个版块。可通过这个来分隔仅需导入一次的数据(noupdate=”1″)和需在每次更新时重新导入的数据(noupdate=”0″)。noupdate=”0″是默认值,所以可以省略不写。注意还必须要有一个外层 XML 元素,就这个例子而言,使用两个标签,并在外层包裹一个或元素。
noupdate标记存储在每条记录的外部标识符信息中。可通过技术菜单中的外部表单手动编辑,勾选不可更新复选框即可。
在这里插入图片描述
在 XML 中定义记录
在 XML 文件中,每个元素有两个基本属性:id 和 model,并包含为对应列设置的值。 id 属性对应记录外部标识符,model 对应目标模型。元素有几种分配值的方法,下面一起来看看。
直接为字段设置值
元素的 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 中还发现之外的元素,如<act_window>和。这些是常用模型的简写方式,是比常用的更为简练的符号。它们用于向 base 模型加载数据、组成用户界面,在后面会作更详细的探讨。
为便于查看,以下是可用的简写元素以及加载数据的对应模型:

在这里插入图片描述

应当注意在用于修改已有记录时,简写元素会覆盖所有字段。这与仅写入所提供字段的基础元素不同。因此在需修改用户界面元素指定字段时,应使用元素。
XML 文件中的其它操作
截至目前我们了解了如何使用 XML 文件添加和更新数据。但也可以通过 XML 文件删除数据以及执行指定模型方法。对更复杂的数据场景会非常有用。
删除记录
我们可以使用元素删除数据记录,使用 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 文件还可以通过元素在加载过程中执行任意方法,可用于设定演示和测试数据。比如 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传递,此处为空列表。
视频演示:
https://download.csdn.net/download/r_nznf/13071665
http://www.tderp.com/download/details/odoo12xml-868
http://ctdrive.tderp.com/file/13502532-468442237

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

r_nznf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值