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. 1 class BookCategory(models.Model):
  2. 2 _name = 'library.book.category'
  3. 3
  4. 4 _parent_store = True
  5. 5 _parent_name = "parent_id" # optional if field is 'parent_id'
  6. 6
  7. 7 name = fields.Char('Category')
  8. 8 # Many2one
  9. 9 parent_id = fields.Many2one(
  10. 10 'library.book.category',
  11. 11 string='Parent Category',
  12. 12 ondelete='restrict',
  13. 13 index=True
  14. 14 )
  15. 15 # One2many
  16. 16 child_ids = fields.One2many(
  17. 17 'library.book.category', 'parent_id',
  18. 18 string='Child Categories')
  19. 19
  20. 20
  21. 21
  22. 22 # Many2many
  23. 23 def _default_author_ids(self):
  24. 24 return return [(6,0,[self.env.user.id])]
  25. 25 def _domain_author_ids(self):
  26. 26 return [('company_id','=',self.env.user.company_id.id)]
  27. 27 # res.partner:关联那个model
  28. 28 # v_Many2many_author:Many2many字段是通过视图实现的,这里指定视图名。也可以不指定,不指定的话接下来的两个参数也不需要设置了
  29. 29 # book_id:本表id
  30. 30 # partner_id: 关联表id
  31. 31 # default: 你还可以设置默认值(所有字段都可以设置)
  32. 32 # readonly: 只读,在form中不可编辑(所有字段都可以设置)
  33. 33 # copy: 表单中action复制功能不携带该字段一起复制(所有字段都可以设置)。
  34. 34 # states:如果你在表中存在state字段,这里就是根据state字段值来更变它的只读属性。或者invisible是否显示。(所有字段都可以设置)
  35. 35 # domain: 过滤。关联字段都能用
  36. 36 author_ids = fields.Many2many('res.partner',
  37. 37 'v_Many2many_author', 'book_id', 'partner_id',
  38. 38 string='Authors',
  39. 39 default=_default_author_ids,
  40. 40 readonly=True,
  41. 41 copy=False,
  42. 42 states={'20': [('readonly', False)], '105': [('readonly', False)]},
  43. 43 domain=_domain_author_ids)
  44. 44
  45. 45 parent_path = fields.Char(index=True)
  46. 46
  47. 47 @api.constrains('parent_id')
  48. 48 def _check_hierarchy(self):
  49. 49 if not self.parent_id._check_recursion():#因为主从都是自己表记录,所以这里要防止出现递归
  50. 50 raise models.ValidationError('Error! You cannot create recursive categories.')
  1. 1 #Many2many你可以指定生成辅助表的名字
  2. 2 #第一个参数是模型名,第二个参数是指定表名,第三个参数是存储主表id的列名,第四个参数是存储从表id的列名。这里domain参数作用是,当你关联数据的时候会自动过滤数据用(该参数在所有关联字段中都可以用)。
  3. 3 right_ids = fields.Many2many('res.groups', 'ship_manage_group_right_rel', 'gid', 'rid', string="Rights", domain=[('name','like','Book')])
  1. 1 #create的时候关联字段如何填写值
  2. 2 #Many2one的值直接填写关联表的id就行
  3. 3 #One2many和Many2many的值为list,每个对象都是元组:
  4. 4 #(0,0,dict_val) 创建一个新的关联记录
  5. 5 #(6,0,id_list) 关联已有的记录的id
  6. 6 slef.env['library.book'].create({
  7. 7 'name':'Linux C',
  8. 8 'author_ids':[(0,0,{'name':'张三'}),(0,0,{'name':'李四'}),(6,0,[1,2,3])]
  9. 9 })
  1. 1 #write的时候关联字段如何写值
  2. 2 #One2many、Many2many更新记录值时和create一样,它的值是一个list,list每个对象是元组
  3. 3 #(0,0,dict_val) 创建新的记录并关联
  4. 4 #(1,id,dict_val) 关联记录并更新指定的id记录
  5. 5 #(2,id) 解除关联,并删除关联记录
  6. 6 #(3,id) 解除关联,并不删除关联记录
  7. 7 #(4,id) 与已存在关联表记录的id进行关联
  8. 8 #(5,) 解除所有关联
  9. 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. CSAPP 之 CacheLab 详解

    前言 本篇博客将会介绍 CSAPP 之 CacheLab 的解题过程,分为 Part A 和 Part B 两个部分,其中 Part A 要求使用代码模拟一个高速缓存存储器,Part B 要求优化矩阵 ...

  2. 【工具-Nginx】从入门安装到高可用集群搭建

    文章已收录至https://lichong.work,转载请注明原文链接. ps:欢迎关注公众号"Fun肆编程"或添加我的私人微信交流经验 一.Nginx安装配置及常用命令 1.环 ...

  3. Linux内网渗透

    Linux虽然没有域环境,但是当我们拿到一台Linux 系统权限,难道只进行一下提权,捕获一下敏感信息就结束了吗?显然不只是这样的.本片文章将从拿到一个Linux shell开始,介绍Linux内网渗 ...

  4. java 5种IO模型

    每日一句 人的痛苦会把自己折磨到多深呢? 每日一句 You cannot swim for new horizons until you have courage to lose sight of t ...

  5. pandas:多层索引

    多层索引是指在行或者列轴上有两个及以上级别的索引,一般表示一个数据的几个分项. 1.创建多层索引 1.1通过分组产生多层索引 1.2由序列创建 1.3由元组创建 1.4可迭代对象的笛卡尔积 1.5将D ...

  6. Spring Ioc源码分析系列--自动注入循环依赖的处理

    Spring Ioc源码分析系列--自动注入循环依赖的处理 前言 前面的文章Spring Ioc源码分析系列--Bean实例化过程(二)在讲解到Spring创建bean出现循环依赖的时候并没有深入去分 ...

  7. Dubbo的基本使用

    Dubbo分为提供者和消费方  并且两者都要注册到ZK上 提供者 注解    @Service   这是dubbo包下的 消费组 注解    @Reference 远程注入 第一步导入依赖 <! ...

  8. 将 Ubuntu 16.04 LTS 的 Unity 启动器移动到桌面底部命令

    将 Ubuntu 16.04 LTS 的 Unity 启动器移动到桌面底部命令: gsettings set com.canonical.Unity.Launcher launcher-positio ...

  9. 万字剖析Ribbon核心组件以及运行原理

    大家好,本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码.本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文章写了一半发现,如果 ...

  10. 6大优势、2种类型,一文吃透动态应用安全测试(DAST)

    在在上篇文章中中,我们了解了 SAST 的概念.优劣和使用的工具,并在文章里提到了另一个软件安全领域里的重要技术 DAST.本文将会详细介绍 DAST 的概念.重要性及其工作原理.   DAST(Dy ...