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框架的了解程度并不是很深,并没有系统地去学习,仅仅只是在做项目的时候遇到不懂得知识才去翻手册. 在上一个项目中因为需要将关联的表的字段 ...
随机推荐
- Java 15 新特性:隐藏类
什么是隐藏类 隐藏类,是一种不能被其他类直接使用的类.引入隐藏类的主要目的是给框架来使用,使得框架可以在运行时生成类,并通过反射间接使用它们.可能有点抽象,不要紧,下面我们通过一个例子来直观的认识它! ...
- 以圆类 Circle 及立体图形类 Solid 为基础设计球类 Sphere
学习内容:以圆类 Circle 及立体图形类 Solid 为基础设计球类 Sphere 代码示例: package 实验三; import java.util.Scanner; class Point ...
- 关于我学git这档子事(2)
将本地main分支push到远程dev分支(不同名分支间的push) 远程dev分支还未创建 (在push同时创建远程dev分支,并将本地main分支内容上传) git push -u --set-u ...
- 行列式&矩阵树定理
行列式: 参考 oi-wiki 定义 对于一个\(n*n\)的矩阵A行列式取值(标量) \(det(A)=|A|=\sum\limits_p(-1)^{\tau(p)}\prod\limits_{i= ...
- python发QQ邮件
python发qq邮件相对比较简单,网上教程一大把:固定套路,后面封装看自己怎么方便可以怎样进行封装:原版代码如下: """ # -*- coding : utf-8 - ...
- 【Github】 Github访问不是私密连接问题
前言 GitHub是一个软件项目的托管平台,是我们经常需要访问的,我原本在学校时候虽然网速比较慢,但是还以能够满足一些代码下载和上传的,在暑假回到家,再去访问的时候就出现了不能访问的问题. 问题描述 ...
- 五分钟搞懂POM设计模式
转载请注明出处️ 作者:IT小学生蔡坨坨 原文链接:五分钟搞懂POM设计模式 大家好,我是IT小学生蔡坨坨. 今天,我们来聊聊Web UI自动化测试中的POM设计模式. 为什么要用POM设计模式 前期 ...
- Python Socket Sever
1. Server code 1 # !/usr/bin/env python 2 # coding:utf-8 3 import multiprocessing 4 import socket 5 ...
- 你真的懂Python命名吗?
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/7417a7f0.html 大家好,我是测试蔡坨坨. 今天,我们来聊一下Python命名那些事儿. 名为万物之始,万物始于无名 ...
- Spring Boot 整合 minio(一步到位)
按照这个步骤来,宝贝保你一步到位 一.minio版本安装:这里我安装的新版本 新版本安装 # docker 下载镜像 docker pull minio/minio # 安装镜像 docker run ...