odoo14 入门解刨关联字段
Odoo中关联字段是用来绑定表与表之间主从关系的。
主从关系指:
首先必须要明白id的存在的意义,它具备“唯一”的属性,也就是表中所有记录中该字段的值不会重复。
假设表A存储是身份证信息,表B存储的是银行卡信息,表B中有一个字段是表A的id,那么我们是不是可以通过身份证id去查询这个人有多少张银行卡?
id的概念是贯穿整个odoo的,因为具有唯一属性的值可以作为数据表的聚集索引,如果理解聚集索引应该就明白,在数亿记录中查询数据和数万记录中查询数据的速度几乎没有区别的。
Odoo中的关联字段都是围绕这个id来进行操作的。
Odoo中的关联字段有:
1.Many2one 主表中创建一个字段来存储从表记录的id。这就意味着主表的每条记录只能关联从表中的一条记录。打个比方,银行卡记录表是主表,我们的身份证是从表,每张银行卡只能属于一个人,也就是每张银行卡只能关联一个身份证。
2.One2many 和上边的Many2one是相反的,主表是身份证,从表是银行卡,一个身份证可以拥有多张银行卡。One2many和Many2one一起使用的时候主从表数据可以互通。odoo中创建这个字段的时候,odoo会创建一张视图来处理他们的关系,获取从表中的id和从表中的存储Many2one字段组成的视图。
3.Many2many 和One2many不一样,odoo会生成辅助表来存储主从表id与id之间的关联,辅助表中有两个字段,一个是主表的id,一个是从表的id,所以这里每个主表id可以与多个从表id关联。和Many2one不同的是,Many2many是单项关联从表,所以从表并不知道。如:身份证表中关联了多张银行卡,但银行卡中没有身份证id的字段;这样的话通过身份证可以得到银行卡的信息,但却不能通过银行卡得到身份证的信息。
- 1 class BookCategory(models.Model):
- 2 _name = 'library.book.category'
- 3
- 4 _parent_store = True
- 5 _parent_name = "parent_id" # optional if field is 'parent_id'
- 6
- 7 name = fields.Char('Category')
- 8 # Many2one
- 9 parent_id = fields.Many2one(
- 10 'library.book.category',
- 11 string='Parent Category',
- 12 ondelete='restrict',
- 13 index=True
- 14 )
- 15 # One2many
- 16 child_ids = fields.One2many(
- 17 'library.book.category', 'parent_id',
- 18 string='Child Categories')
- 19
- 20
- 21
- 22 # Many2many
- 23 def _default_author_ids(self):
- 24 return return [(6,0,[self.env.user.id])]
- 25 def _domain_author_ids(self):
- 26 return [('company_id','=',self.env.user.company_id.id)]
- 27 # res.partner:关联那个model
- 28 # v_Many2many_author:Many2many字段是通过视图实现的,这里指定视图名。也可以不指定,不指定的话接下来的两个参数也不需要设置了
- 29 # book_id:本表id
- 30 # partner_id: 关联表id
- 31 # default: 你还可以设置默认值(所有字段都可以设置)
- 32 # readonly: 只读,在form中不可编辑(所有字段都可以设置)
- 33 # copy: 表单中action复制功能不携带该字段一起复制(所有字段都可以设置)。
- 34 # states:如果你在表中存在state字段,这里就是根据state字段值来更变它的只读属性。或者invisible是否显示。(所有字段都可以设置)
- 35 # domain: 过滤。关联字段都能用
- 36 author_ids = fields.Many2many('res.partner',
- 37 'v_Many2many_author', 'book_id', 'partner_id',
- 38 string='Authors',
- 39 default=_default_author_ids,
- 40 readonly=True,
- 41 copy=False,
- 42 states={'20': [('readonly', False)], '105': [('readonly', False)]},
- 43 domain=_domain_author_ids)
- 44
- 45 parent_path = fields.Char(index=True)
- 46
- 47 @api.constrains('parent_id')
- 48 def _check_hierarchy(self):
- 49 if not self.parent_id._check_recursion():#因为主从都是自己表记录,所以这里要防止出现递归
- 50 raise models.ValidationError('Error! You cannot create recursive categories.')
- 1 #Many2many你可以指定生成辅助表的名字
- 2 #第一个参数是模型名,第二个参数是指定表名,第三个参数是存储主表id的列名,第四个参数是存储从表id的列名。这里domain参数作用是,当你关联数据的时候会自动过滤数据用(该参数在所有关联字段中都可以用)。
- 3 right_ids = fields.Many2many('res.groups', 'ship_manage_group_right_rel', 'gid', 'rid', string="Rights", domain=[('name','like','Book')])
- 1 #create的时候关联字段如何填写值
- 2 #Many2one的值直接填写关联表的id就行
- 3 #One2many和Many2many的值为list,每个对象都是元组:
- 4 #(0,0,dict_val) 创建一个新的关联记录
- 5 #(6,0,id_list) 关联已有的记录的id
- 6 slef.env['library.book'].create({
- 7 'name':'Linux C',
- 8 'author_ids':[(0,0,{'name':'张三'}),(0,0,{'name':'李四'}),(6,0,[1,2,3])]
- 9 })
- 1 #write的时候关联字段如何写值
- 2 #One2many、Many2many更新记录值时和create一样,它的值是一个list,list每个对象是元组
- 3 #(0,0,dict_val) 创建新的记录并关联
- 4 #(1,id,dict_val) 关联记录并更新指定的id记录
- 5 #(2,id) 解除关联,并删除关联记录
- 6 #(3,id) 解除关联,并不删除关联记录
- 7 #(4,id) 与已存在关联表记录的id进行关联
- 8 #(5,) 解除所有关联
- 9 #(6,0,id_list) 解除原有的关联,替换成与id_list关联
注意事项:最好所有的更新不要直接写sql语句去更新值,因为odoo充分的利用了缓存,一搞不好你的数据就不同步了。比如你写sql语句更新了用户的权限,然而你使用的时候发现权限并没有生效,直到你重启服务后才会生效;这是因为权限对于odoo来说是访问量最大的一部分数据,所以它会直接读取缓存数据从而加快读取速度,因此如果你需要修改的用户权限立即生效的话就必须使用write去更新记录。并且最好前端刷新界面。
odoo14 入门解刨关联字段的更多相关文章
- Java web--反射(解刨)
本质:先加载类 再解刨类的方法,字段,构造函数 目的:解刨出构造函数 为了new对象 解刨出字段 为了封装数据进去 解刨方法 ...
- Java 学习之反射机制“解刨”分解类,并获取内容!
正常情况下,单纯的做开发是接触不到反射机制的(额,当然并不排除例外的情况了).下面我就对我学到的反射方面的知识做一个小小的总结,旨在复习和以后的查看. 原理分析: 所谓反射就是将一个类当做我们研究的对 ...
- 资深阿里程序员一一为你解刨Web前端知识体系结构,付出与收获成正比!
只要接触过前端,都会指导web前端的知识主要由三部分组成:分别为静态html,样式css,动态javascript(简称js)这三大部分组成.其三部分组成的一个体系的复杂程度不亚于其他一门技术的复杂程 ...
- 从sql语句的角度解刨SqlServer插入语句的并发问题
今天收到一个小学弟的求助,数据库插入偶尔重复,怎么在sql语句上进行解决. Q:学长,我导入excel数据的操作,平时使用好好的,怎么突然发生插入重复的问题? A:你是使用哪个ORM框架进行操作的? ...
- [moka同学笔记]三、Yii2.0课程笔记(魏曦老师教程)关联字段增加搜索
关联字段增加搜索 post表关联adminuser表,通过post.author_id adminuser.id关联,在YII2.0生成搜索,关联字段搜索时,需要输入关联字段author的id才能搜 ...
- 无废话ExtJs 入门教程九[数字字段:NumberField、隐藏字段Hidden、日期字段:DataFiedl]
无废话ExtJs 入门教程九[数字字段:NumberField.隐藏字段Hidden.日期字段:DataFiedl] extjs技术交流,欢迎加群(201926085) 继上第六节内容,我们在表单里加 ...
- jQuery Validate 表单验证插件----通过name属性来关联字段来验证,改变默认的提示信息,将校验规则写到 js 代码中
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二. 添加一个另外一个插件jquery.validate.messages_cn.js. ...
- openerp学习笔记 计算字段、关联字段(7.0中非计算字段、关联字段只读时无法修改保存的问题暂未解决)
计算字段.关联字段,对象修改时自动变更保存(当 store=True 时),当 store=False 时,默认不支持过滤和分组7.0中非计算字段.关联字段只读时无法修改保存的问题暂未解决 示例代码: ...
- YII关联字段并带搜索排序功能
1.简介 从接触yii框架到现在已经快有两个月了,但是自己对yii框架的了解程度并不是很深,并没有系统地去学习,仅仅只是在做项目的时候遇到不懂得知识才去翻手册. 在上一个项目中因为需要将关联的表的字段 ...
随机推荐
- 运维:ITIL V3
TIL 简史 在20 世纪80 年代末期,英国商务部(OGC,Office Government Commerce)发布了ITIL .OGC 最初的目标是通过应用IT 来提升政府业务的效率:目标是能够 ...
- 将MySQL查询结果导出到Excel
总结将mysql的查询结果导出到文件的方法 总结 使用命令 select user, host, password from mysql.user into outfile '/tmp/user.xl ...
- 使用Spring MVC开发RESTful API(续)
使用多线程提高REST服务性能 异步处理REST服务,提高服务器吞吐量 使用Runnable异步处理Rest服务 AsyncController.java @RestController @GetMa ...
- 205. Isomorphic Strings - LeetCode
Question 205. Isomorphic Strings Solution 题目大意:判断两个字符串是否具有相同的结构 思路:构造一个map,存储每个字符的差,遍历字符串,判断两个两个字符串中 ...
- 48. Rotate Image - LeetCode
Question 48. Rotate Image Solution 把这个二维数组(矩阵)看成一个一个环,循环每个环,循环每条边,每个边上的点进行旋转 public void rotate(int[ ...
- 个人冲刺(六)——体温上报app(一阶段)
任务:完成了自动获取定位信息以及自动获取时间功能 自动获取定位信息 public void onReceiveLocation(BDLocation location){ //此处的BDLocatio ...
- TypeError: this.getOptions is not a function
我在vue ui界面中安装版本依赖包后报这个错误 less-loader/sass-loader安装的版本过高 解决办法 删除原有的版本依赖包,安装更低版本的依赖包. 如 @6.0.1为选择安装的版本 ...
- 基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- git bisect:让你闭眼都能定位疑难 bug的利器
摘要:git bisect命令使用二分搜索算法来查找提交历史中的哪一次提交引入了错误.它几乎能让你闭着眼睛快速定位任何源码导致的问题,非常实用. 本文分享自华为云社区<利用好 git bisec ...
- STM32内存知识
在了解STM32内存之前需要了解 MCU 的型号和MDK 中的.map 文件,很多刚学习 stm32 时都不会过多的去了解 MCU 的选型,是在太枯燥了.这里在从新了解一下,久了就熟悉了. 一.STM ...