odoo10 继承(扩展)、模块数据

一:继承

在不改变底层对象的时候添加新的功能——这是通过继承机制来实现的,作为在现有对象之上的修改层,这些修改可以发生在所有级别:模型,视图和业务逻辑。不是直接修改现有模块,而是创建一个新模块以添加预期的修改。

1:扩展模型

Odoo 模型存在 Python 的模块之外, 在中间注册表那里。对于这个注册表,可以通过模型的方法使用self.env[<model name>]进入。 例如, 通过res.partner 模型获取对象的引用, 代码书写如下 self.env['res.partner']。

 添加字段:

# -*- coding: utf-8 -*-
from odoo import models, fields, api
class Sub(models.Model):
_inherit = 'Root'  //通过_inherit属性来继承父模型
newCol=fields.XX....  //在下面添加新字段即可。

修改现有字段:

为了改变现有字段的属性,只需再次定义该字段,需要修改的属性显式重写即可,会保留未修改的所有其他未在此处明确使用的字段的属性。

添加方法:

添加新方法很简单:只需在继承类中声明新的函数。

修改方法:

扩展或更改现有逻辑,可以通过声明具有完全相同名称的方法来覆盖相应的方法

新方法将替换前一个方法,它可以只是扩展继承类的代码,使用Python的super()方法来调用父方法。然后,可以在调用super()方法之前和之后,在原有逻辑周围添加新逻辑。

 扩展模型的几种方式:

1)类继承:扩展类中没有_name属性,因为它继承了父类的_name。对现有模型的扩展, 添加新功能,都将添加到现有模型中,不会创建新模型。 因此,在odoo中,根据_name唯一确定这个模型时找到的就是扩展后的类。(如上面添加字段是类继承)

2)原型继承:我们想使用具有不同于父模型的值的_name属性,我们将获得一个新模型重用来自继承的特性,但是具有自己的数据库表和数据。其实就是把继承的类的功能特性拷贝衣服给新的模型使用,并不改变被继承模型。

复制意味着被继承的方法和字段也将在继承模型中可用。 对于字段,这意味着它们也将被创建并存储在目标模型的数据库表中。 原始(继承)和新(继承)模型的数据记录保持不相关。 只有定义是共享的。

3)代理继承(委托继承):使用_inherits属性,它允许一个模型以透明的方式包含其他模型。通过字典映射继承模型与字段的关系,并关联它们。(相当于成员变量:引用一个外部的类对象赋值给这个模型的一个成员,但是对象的值是保存在被引用的类的数据库表中的。但是在当前类通过成员修改了变量值的,则会同步到被引用的类的数据库表中)

优点是不需要在几个表之间重复数据结构,例如地址。 任何需要包含地址的新模型都可以将其委派给嵌入式合作伙伴模型。 如果在合作伙伴地址字段中引入了修改,则这些修改会立即提供给嵌入它的所有模型!

 

2:扩展视图

表单,列表和搜索视图是使用arch XML结构定义的。 要扩展视图,我们需要一种方法来修改这个XML。 这意味着需要定位XML中的元素位置,然后在这些位置引入修改。

对于XML,在其中定位元素的最好方法是使用XPath表达式。如果XPath表达式匹配到多个元素,只有第一个元素会被修改。 因此,表达式应该使用独特的属性以使其指定尽可能具体。 使用name属性是确保我们找到扩展点的确切xml元素的最简单方法。 因此,在我们的视图XML元素上定义name属性是很重要的。

Xpath表达式的格式:expr="//标签名[@属性]='属性值'":找到属性=属性值的标签位置。

下面是一个写在arch中的实现在is_done字段之前添加date_deadline字段的具体例子:

<xpath expr="//field[@name]='is_done'" position="before"> //expr属性值的意思是:找到<filed name="is_done"/>的标签<field name="date_deadline" />
</xpath> 

Odoo为此提供了快捷符号,因此大多数时候我们可以完全避免XPath语法。 我们仅使用要定位的元素的特定属性及定位类型相关信息就可以了。

<field name="is_done" position="before"><field name="date_deadline" /></field> 

如果字段在同一视图中多次出现,则应始终使用XPath语法

position属性是可选的:

after:将内容添加到父元素之中,匹配的节点之后。
before:添加内容在匹配节点之前。
inside(默认值):匹配节点内的追加内容。
replace:替换匹配的节点。如果使用空内容,它将删除该匹配的元素。
attributes:修改匹配元素的XML属性。在元素内容使用<attribute name =“attr-name”>实现给属性name设置新属性值attr-name。

1)扩展表单视图

<record id="view_form_模块名_inherited" model="ir.ui.view"><field name="name">模块名_extension</field><field name="model">模块.数据模型</field><field name="inherit_id" ref="模块_模型.被继承的form表单name属性"/><field name="arch" type="xml"> //在arch中进行扩展操作:定位—>插入/修改<field name="定位标签位置" position="在标签的哪里进行扩展"><field ......> //扩展内容</field></field>
</record> 

2)扩展列表视图

<record id="view_tree_模型名_inherited" model="ir.ui.view"><field name="name">模型名 extension</field><field name="model">模块.模型</field><field name="inherit_id" ref="被继承的tree视图name名"/><field name="arch" type="xml">//在arch中进行扩展<field name="定位标签名" position="扩展位置"> <field ....进行扩展 /></field></field></record>

3)扩展搜索视图

<record id="view_filter_模型名_inherited" model="ir.ui.view"><field name="name"> extension</field><field name="model">模型名</field><field name="inherit_id" ref="被继承的filter视图名"/><field name="arch" type="xml"> //下面进行定位、扩展举例<field name="name" position="after"><filter name="filter_my_tasks" string="My Tasks" domain="[('user_id','in',[uid,False])]" /></field> </field></record> 

 4)修改记录

对于记录:

<record id="x" model="y">

数据记录加载时,实际上对模型y执行了create或update操作︰ 如果记录x不存在,则创建它; 否则,更新原来对应的值。 

修改菜单项:

< ! — — 修改菜单项-->
<record id="菜单视图id" model="ir.ui.menu">//进行修改
</record>

修改action_window

<record model="ir.actions.act_window"id="action菜单id">//进行修改
</record>

二:模块数据

1:列表数据的导出

数据导出是tree视图的标准功能,不涉及编码。

只需在列表视图左侧复选框勾选需要导出的记录,然后点击列表上方“动作”下拉列表,选择“导出”。

在导出对话框中选择需要导出的列、导出的格式(一般选择CSV,勾选 导入兼容导出),然后点击“导出到文件”即可。

2:导入数据

在面板点击“导入”按钮,选择文件后载入。然后点击“验证”,检查文件内容的格式合法性,如果正常,则点击“导入”即可。

3:模块数据

模块使用数据文件,将其配置加载到数据库,可以通过CSV和XML文件完成。为了完整性,也可以使用YAML文件格式,但是它很少用于加载数据。

一个附加的限制是文件名必须与要加载数据的模型的名称匹配,这样系统才可以推断应该将数据导入相应的模型。

数据CSV文件的常见用法是加载到ir.model.access模型中的安全定义。

4:演示数据

一个模块在安装时,尽量事先定义一些演示数据,方便在安装后进行测试使用。

演示数据我们放在data目录下,命名为 xx.xx.csv或者xx.xx.xml

然后在manifest文件中的data属性进行配置。

5:XML

 noupdate:重复数据加载时,将重写上次运行中加载的记录。 这意味着升级一个模块将覆盖在数据库内可能已经进行的任何手动更改。此重新导入行为是默认值,但可以更改,以便在升级模块时,某些数据文件记录保持不变。 这是通过<odoo>或元素的noupdate =“1”属性完成的。 这些记录将在安装addon模块时创建,但在后续模块升级中不会对其进行任何操作

XML中定义记录:

每个<record>元素有两个基本属性id和model,并且包含为每列分配值的<field>元素。如前所述,id属性对应于记录的外部标识符,并且模型属性对应于要写入记录的目标模型

设置字段值的几种方式如下:

1:<record>元素定义数据记录并包含<field>元素以设置每个字段的值,field元素的name属性标识要写入的字段,要写入的值是元素内容:字段的开始和结束标记之间的文本。

2:定义字段值的更精细的替代方法是eval属性:它评估一个Python表达式并将结果值分配给字段。

<field name="date_deadline"eval="(datetime.now() + timedelta(-1)).strftime('%Y-%m-%d')" /> 

3:<field>元素还有一个ref属性,用于使用外部标识符设置many-to-one字段的值。

<field name="user_id" ref="base.user_demo" /> 

XML中触发函数:

可以通过<function>元素,在其加载过程中执行方法。这可以用来建立演示和测试数据。

<functionmodel="数据模型"name="数据模型中的方法"eval="参数" />

另一方式是触发工作流:

<workflow model="模型"
ref="工作流实例"
action="工作流信号:触发工作流" />

 

转载于:https://www.cnblogs.com/soleZ/p/10076040.html

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

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

相关文章

做一个vue的todolist列表

<template><div id"app"><input type"text" v-model"todo" ref"ip"/><button click"add()">新增</button><br/><br/><hr/><ul><li v-for"(item,key) in li…

hadoop+hive-0.10.0完全分布式安装方法

hadoophive-0.10.0完全分布式安装方法 1、jdk版本&#xff1a;jdk-7u60-linux-x64.tar.gz http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260.html 2、hive版本&#xff1a;hive-0.10.0.tar.gz https://archive.apache.org/dist/hive/hive-0…

关于gitgithub的操作

先马克&#xff0c;回头细看&#xff0c;然后整理一下 https://linux.cn/article-4292-1.html转载于:https://www.cnblogs.com/mengjie1001/p/10076530.html

一种解决 MacBook 里的 App Store 无法登录的问题

刚刚买回来的 2018 款带有 touchbar 的 MacBook Pro 15 inc 在用 App Store 安装 app 时一直无法登录成功&#xff08;网络链接都是好的&#xff09;&#xff0c;导致软件都无法更新&#xff0c;折腾了挺一会的。 后来发现是要退出设置里的 iCloud 登录&#xff0c;然后重新登录…

第二次冲刺

1、今日各个成员的问题 组员问题张晋誌对mui的API看得不是很懂&#xff0c;无法顺利的使用袁庆杰基础不牢,编写困难周建峰eclipse没法创建web项目&#xff0c;按照网上的方法&#xff0c;check for updates 和 install new software 之后也没用许家烨给单一功能知道如何实现但项…

牌类游戏使用微服务重构笔记(八): 游戏网关服务器

网关服务器 所谓网关&#xff0c;其实就是维持玩家客户端的连接&#xff0c;将玩家发的游戏请求转发到具体后端服务的服务器&#xff0c;具有以下几个功能点&#xff1a; 长期运行&#xff0c;必须具有较高的稳定性和性能对外开放&#xff0c;即客户端需要知道网关的IP和端口&a…

配置独立于系统的PYTHON环境

配置独立于系统的PYTHON环境 python 当前用户包 一种解决方案是在利用本机的python环境的基础上&#xff0c;将python的包安装在当前user的.local文件夹下 一共有两种方式来实现pip的时候安装到当前user 设置pip配置文件 pip.conf 一种是在~/.pip文件夹下的pip配置文件pip.conf…

好程序员技术教程分享JavaScript运动框架

好程序员技术教程分享JavaScript运动框架&#xff0c;有需要的朋友可以参考下。 JavaScript的运动&#xff0c;即让某元素的某些属性由一个值变到另一个值的过程。如让div的width属性由200px变到400px&#xff0c;opacity属性由0.3变到1.0&#xff0c;就是一个运动过程。 实现运…

linux 下mysql等php的安装 lnmp

访问https://lnmp.org/install.html按照步骤安装 当下载执行完 wget -c http://soft.vpser.net/lnmp/lnmp1.3.tar.gz && tar zxf lnmp1.3.tar.gz && cd lnmp1.3 && ./install.shlnmp 要到.install.sh下改一下下载地址&#xff0c;把http直接更换成…

单纯形法

单纯形法 如果目标函数中所有系数都非正&#xff0c;那么显然这些变量直接取0是最优的&#xff0c;所以此时答案为即为常数项。 我们要做的就是通过转化把目标函数的系数全部搞成非负。 思路就是用非基变量替换基变量。 先找到一个目标函数中系数为正的变量&#xff0c;在所有限…

洛谷P1828 香甜的黄油 Sweet Butter

香甜的黄油 Sweet Butter 黄油真的是这么做的吗&#xff1f;&#xff01;&#xff01;&#xff01;[惶恐] 这道题是Dijkstra算法的简单变形 通过题意我们要找到一个点使奶牛所在点的路程和最短。通过Dijkstra的模板我们可以求的一点到其他任一点的最短路径&#xff0c;那么我们…

JAVA List集合转Page(分页对象)

/*** version 1.0* author: fwjia*/ import java.util.List;public class PageModel<T> {/**** 当前页*/private int page 1;/**** 总页数*/public int totalPages 0;/**** 每页数据条数*/private int pageRecorders;/**** 总页数*/private int totalRows 0;/**** 每页…

分区分表实验用的语句

--查看索引 select * from DBA_IND_PARTITIONS &#xff54;; select status,t.* from dba_indexes t where t.OWNERGANSUSC; select count(*) from ACT_HI_VARINST SELECT ALTER INDEX || TABLE_OWNER || . || INDEX_NAME || UNUSABLE; UNUSABLE_INDEX FROM ALL_INDEX…

分布式数据库数据一致性的原理、与技术实现方案

http://youzhixueyuan.com/the-principle-and-technology-realization-of-distributed-data-consistency.html 背景 可用性&#xff08;Availability&#xff09;和一致性&#xff08;Consistency&#xff09;是分布式系统的基本问题&#xff0c;先有著名的CAP理论定义过分布式…

模块之re模块 —— 正则

#‘match’只匹配从左向右第一个值是否在中括号的范围内&#xff0c;如果没有就返回None 如果有就直接打印一个对象&#xff0c;加上.group()就可以返回你要找的区间里面的值&#xff0c;如果没有找到对应的值&#xff0c;加上‘.group()’会报错 #‘search’ 默认是从整个st…

centos7 docker

Docker 是一个开源工具&#xff0c;它可以让创建和管理 Linux 容器变得简单。容器就像是轻量级的虚拟机&#xff0c;并且可以以毫秒级的速度来启动或停止。Docker 帮助系统管理员和程序员在容器中开发应用程序&#xff0c;并且可以扩展到成千上万的节点。 容器和 VM&#xff08…

批处理ping指定ip列表

for /f in (filename) do (command) for /f %i in (C:\ip.txt) do (ping %i -n 1 && echo %i 通 >>IP.txt || echo %i 不通 >>IP1.txt) 有返回写入ip.txt 没有写入ip1.txt转载于:https://blog.51cto.com/2216859/2384188

Intellij Idea 2017创建web项目及tomcat部署实战

相关软件&#xff1a;Intellij Idea2017、jdk16、tomcat7 Intellij Idea直接安装&#xff08;可根据需要选择自己设置的安装目录&#xff09;&#xff0c;jdk使用1.6/1.7/1.8都可以&#xff0c;主要是配置好系统环境变量&#xff0c;tomcat7上tomcat的官网下载压缩包解压即可。…

docker ssh

1&#xff0c;首先&#xff0c;需要从Docker官网获得centos或Ubuntu镜像 2&#xff0c;当本地已有Ubuntu镜像后&#xff08;大概200M左右大小&#xff09;&#xff0c;使用如下命令 [cpp]view plaincopy docker run -t -i ubuntu /bin/bash 即可启动一个容器&#xff0c;并放…

[BFS]JZOJ 4672 Graph Coloring

Description 现在你有一张无向图包含n个节点m条边。最初&#xff0c;每一条边都是蓝色或者红色。每一次你可以将一个节点连接的所有边变色&#xff08;从红变蓝&#xff0c;蓝变红&#xff09;。找到一种步数最小的方案&#xff0c;使得所有边的颜色相同。Input 第一行包含两个…