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 入门解刨关联字段的更多相关文章

  1. Java web--反射(解刨)

    本质:先加载类           再解刨类的方法,字段,构造函数 目的:解刨出构造函数       为了new对象 解刨出字段             为了封装数据进去 解刨方法           ...

  2. Java 学习之反射机制“解刨”分解类,并获取内容!

    正常情况下,单纯的做开发是接触不到反射机制的(额,当然并不排除例外的情况了).下面我就对我学到的反射方面的知识做一个小小的总结,旨在复习和以后的查看. 原理分析: 所谓反射就是将一个类当做我们研究的对 ...

  3. 资深阿里程序员一一为你解刨Web前端知识体系结构,付出与收获成正比!

    只要接触过前端,都会指导web前端的知识主要由三部分组成:分别为静态html,样式css,动态javascript(简称js)这三大部分组成.其三部分组成的一个体系的复杂程度不亚于其他一门技术的复杂程 ...

  4. 从sql语句的角度解刨SqlServer插入语句的并发问题

    今天收到一个小学弟的求助,数据库插入偶尔重复,怎么在sql语句上进行解决. Q:学长,我导入excel数据的操作,平时使用好好的,怎么突然发生插入重复的问题? A:你是使用哪个ORM框架进行操作的? ...

  5. [moka同学笔记]三、Yii2.0课程笔记(魏曦老师教程)关联字段增加搜索

    关联字段增加搜索 post表关联adminuser表,通过post.author_id  adminuser.id关联,在YII2.0生成搜索,关联字段搜索时,需要输入关联字段author的id才能搜 ...

  6. 无废话ExtJs 入门教程九[数字字段:NumberField、隐藏字段Hidden、日期字段:DataFiedl]

    无废话ExtJs 入门教程九[数字字段:NumberField.隐藏字段Hidden.日期字段:DataFiedl] extjs技术交流,欢迎加群(201926085) 继上第六节内容,我们在表单里加 ...

  7. jQuery Validate 表单验证插件----通过name属性来关联字段来验证,改变默认的提示信息,将校验规则写到 js 代码中

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二. 添加一个另外一个插件jquery.validate.messages_cn.js. ...

  8. openerp学习笔记 计算字段、关联字段(7.0中非计算字段、关联字段只读时无法修改保存的问题暂未解决)

    计算字段.关联字段,对象修改时自动变更保存(当 store=True 时),当 store=False 时,默认不支持过滤和分组7.0中非计算字段.关联字段只读时无法修改保存的问题暂未解决 示例代码: ...

  9. YII关联字段并带搜索排序功能

    1.简介 从接触yii框架到现在已经快有两个月了,但是自己对yii框架的了解程度并不是很深,并没有系统地去学习,仅仅只是在做项目的时候遇到不懂得知识才去翻手册. 在上一个项目中因为需要将关联的表的字段 ...

随机推荐

  1. js通用对象数组冒泡排序

    数组对象通用 function sort(data, sortFiled, orderby) { var result = data, temp; for (var i = 0; i < res ...

  2. OpenHarmony3.1 Release版本特性解析——硬件资源池化架构介绍

    李刚 OpenHarmony 分布式硬件管理 SIG 成员 华为技术有限公司分布式硬件专家 OpenHarmony 作为面向全场景.全连接.全智能时代的分布式操作系统,通过将各类不同终端设备的能力进行 ...

  3. MongoDB 常用启动参数

    每日一句 Once you choose your way of life, be brave to stick it out and never return. 生活的道路一旦选定,就要勇敢地走到底 ...

  4. 通过CSS让图片变的清楚

    image { width: 100%; height: 100%; border-radius: 10upx; //让图片变清楚 image-rendering: -moz-crisp-edges; ...

  5. 关于我学git这档子事

    创建本地分支并切换到该分支 git checkout -b *** 相当于如下2个命令: git branch *** git checkout *** 推送本地开发分支到远程开发分支 git pus ...

  6. 微信小程序避坑指南——echarts层级太高/层级遮挡

    问题:小程序中echarts因为小程序原生的canvas层级太高,而导致弹窗这类dom元素无法遮挡住canvas,如下图: 解决方案1:(wx:if控制dom显隐,显示canvas就重新渲染echar ...

  7. SPFA 最短路算法

    SPFA算法 1.什么是spfa算法? SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA一般情况复杂度是O(m)O(m) ...

  8. Linux版本的项目环境搭建

    项目环境docker及docker-compose文档 1.Linux环境介绍 centos7.6 16G以上内存空间(至少8G) 2.静态IP设置 1.找到配置文件 cd /etc/sysconfi ...

  9. Java注解和反射

    1.注解(Annotation) 1.1.什么是注解(Annotation) 注解不是程序本身,可以在程序编译.类加载和运行时被读取,并执行相应的处理.注解的格式为"@注释名(参数值)&qu ...

  10. 使用React.js写一个类似单选框与复选框的功能

    单选框 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <tit ...