odoo17 | 模型之间的关系

news2025/5/31 21:34:47

前言

上一章介绍了自定义的创建 包含基本字段的模型的视图。但是,在任何实际业务场景中,我们需要的不仅仅是 一个模型。此外,模型之间的链接是必要的。人们可以很容易地想象一个模型包含 客户和另一个包含用户列表的客户。您可能需要推荐客户 或任何现有商业模式的用户。

在我们的房地产模块中,我们需要房产的以下信息:

  • 购买房产的客户

  • 出售房产的真正重述经纪人

  • 物业类型:洋房、公寓、顶层公寓、城堡…

  • 该物业的特征标签列表:舒适,翻新…

  • 收到的报价列表

Many2one(多对一)

class odoo.fields.Many2one
这样一个字段的值是一个大小为0(没有记录)或1(单个记录)的记录集。
参数:

  • comodel_name (str) -目标型号名称必选,相关字段或扩展字段除外。

  • domain 一个可选的域,可以在客户端的候选值上设置(域或将被计算以提供域的python表达式)

  • context (dict)——在客户端处理该字段时使用的可选上下文

  • ondelete (str) -当引用的记录被删除时做什么;可能的值是:‘set null’, ‘restrict’, ‘cascade’

  • auto_join (bool) -在搜索该字段时是否生成join(默认:False)

  • delegate (bool) -将其设置为True以使目标模型的字段可以从当前模型访问(对应于_inherits)

  • check_company(bool) -在_check_company()中标记要验证的字段。根据字段属性添加默认公司域。

目标:

  • 应使用相应的菜单、操作和视图创建一个新模型
    在这里插入图片描述
    -三个Many2one 字段应该被添加到 estate.property 模型: 属性 type(类型), buyer(买家) 和seller(卖家)

在房地产模块中,我们要定义属性类型的概念。例如,房产类型是房子或公寓。根据属性的类型对属性进行分类是一种标准的业务需求,尤其是在细化过滤时。

一个属性可以有一个类型,但是相同的类型可以分配给许多属性。这得到了many2one(多对一)概念的支持。

many2one 是指向另一个对象的简单链接。例如,为了在我们的测试模型中定义到res.partner 的链接,我们可以这样写:

partner_id = fields.Many2one("res.partner", string="Partner")

按照惯例,许多字段都有_id后缀。然后可以很容易地通过以下方式访问合作伙伴(partner)中的数据:

print(my_test_object.partner_id.name)

在实践中,many2one 可以看作是窗体视图中的下拉列表。

在房地产模块中,我们仍然缺少两条关于房产的信息: 买方和销售人员。买方可以是任何个人,但另一方面 销售人员必须是房地产中介的雇员(即Odoo用户)。

在Odoo中,我们通常指的是两种模型:

  • res.partner:合作伙伴是自然人或法人实体。它可以是公司、个人或 甚至是联系地址。

  • res.users:系统的用户。用户可以是“内部的”,即他们有 访问 Odoo 后端。或者它们可以是“门户”,即它们无法访问后端,只能访问 前端(例如,在电子商务中访问他们以前的订单)。

注意

self.env对象允许访问请求参数和其他有用的东西:

  • self.env.crself.cr 是数据库游标对象;用于查询数据库

  • self.env.uidself._uid 是当前用户的数据库id

  • self.env.user 是当前用户的记录

  • self.env.context或者self._context 是上下文字典

  • self.env.ref(xml_id) 返回与XML id对应的记录

  • self.env[model_name] 返回给定模型的实例

Many2many (多对多)

class odoo.fields.Many2many[source]

Many2many 字段的值是一个记录集.

参数:
comodel_name – 目标模型的名称(字符串)必选,相关或扩展字段除外

relation (str) – 在数据库中存储关系的表的可选名称

column1 (str) – 引用表中“这些”记录的列的可选名称

column2 (str) – 引用表关系中“那些”记录的列的可选名称

属性relation, column1和column2是可选的。如果没有给出,则从模型名自动生成名称,只要model_name和comodel_name不同!

请注意,在具有相同模型的给定模型上有几个具有隐式关系参数的字段是不被ORM接受的,因为这些字段将使用相同的表。ORM防止两个many2many字段使用相同的关系参数,除非:

  • 两个字段使用相同的模型,模型和关系参数是显式的

  • 至少有一个字段属于**_auto = False** 的模型

domain – 一个可选的域,在客户端的候选值上设置(域或一个python表达式,将被计算以提供域)

context (dict) – 在处理该字段时在客户端使用的可选上下文

check_company (bool) – 在_check_company()中标记要验证的字段。根据字段属性添加默认公司域。

目标

  • 应该用相应的菜单和操作创建一个新的estate.property.tag模型。
  • 标签添加到 estate. property 模型中:
    在这里插入图片描述

在我们的不动产模块中,我们想要定义属性标签的概念。例如,属性标签是“舒适(cozy)”或“翻新(renovated)”的属性。

一个属性可以有多个标签,一个标签可以分配给多个属性。这得到了多对多概念的支持。

many2many是一种双向多重关系: 一端的任何记录都可以与另一端的任意数量的记录相关联。例如,为了定义到帐户的链接。在我们的测试模型上,我们可以这样写:

tax_ids = fields.Many2many("account.tax", string="Taxes")

按照惯例,many2many字段具有_ids后缀。这意味着几个税可以添加到我们的测试模型中。它的行为就像一个记录列表,这意味着访问数据必须在循环中完成:

for tax in my_test_object.tax_ids:
    print(tax.name)

记录列表称为记录集,即记录的有序集合。它支持对集合的标准Python操作,如len()和iter(),以及额外的集合操作,如recs1 | recs2。

One2many(一对多)

class odoo.fields.One2many[source]
One2many字段;该字段的值是comodel_name中所有记录的记录集,使得字段inverse_name等于当前记录。

参数:

comodel_name (str) – 目标模型的名称

inverse_name (str) – 目标模型中反向Many2one字段的名称

domain – 一个可选的域,在客户端的候选值上设置(域或一个python表达式,将被计算以提供域)

context (dict) – 在处理该字段时在客户端使用的可选上下文

auto_join (bool) – 是否在搜索该字段时生成join (默认值:False)

  • comodel_name和inverse_name属性为必选项,相关字段或字段扩展除外。

目标

  • 应该用相应的表单和树视图创建一个新的estate.property.offer模型。

  • offers 应该加到estate.property模型:
    在这里插入图片描述
    在我们的房地产模块中,我们要定义房地产报价的概念。物业报价是潜在买家向卖家提供的金额。报价可以低于预期价格,也可以高于预期价格。

一个报价适用于一个物业,但同一物业可以有多个报价。many2one的概念再次出现。但是,在本例中,我们希望显示给定属性的报价列表,因此我们将使用one2many概念。
one2many是many2one的反转。例如,我们在测试模型中定义了一个指向res.partner模型的链接,这要归功于partner_id字段。我们可以定义反转关系,即链接到我们的合作伙伴的测试模型列表:

test_ids = fields.One2many("test_model", "partner_id", string="Tests")

第一个参数称为 目标模型,第二个参数是目标模型的目标字段。

按照约定,one2many 字段的后缀是_ids ,它们表现为一个记录列表,这意味着访问数据必须在一个循环中完成:

for test in partner.test_ids:
    print(test.name)

注意

因为 One2many 是一个虚拟关系,所以在 目标模型 中必须定义一个 Many2one 字段。

使用Odoo框架的神奇之处在于:有时事情是隐式定义的。当我们通过one2many字段创建记录时,相应的many2one会自动填充以方便使用

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

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

相关文章

分布式图文详解!

分布式理论 1. 说说CAP原则? CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)这3个基本…

进程的韵律:探索计算机世界中的动态舞台

这里写目录标题 进程定义进程的组成进程与程序区别进程与线程区别进程特点进程控制结尾 进程定义 进程:一个具有一定功能的程序在一个数据集合上的一次动态执行过程。 进程是指正在运行的程序,它是操作系统进行资源分配和调度的基本单位。在计算机中&…

【安装pybluez】报错解决python setup.py egg_info did not run successfully.

python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [1 lines of output] error in PyBluez setup command: use_2to3 is invalid. [end of output] Preparing metadata (setup.py) … error error: subprocess-exited-with-error python setup.p…

SpringBoot连接MySQL并整合MyBatis-Plus

SpringBoot连接MySQL并整合MyBatis-Plus 配置springboot版本目录结构pom.xml文件application.yml数据库表代码Test.javaTestMapper.javaTestMapper.xmlTestService.javaTestServiceImpl.javaTestController.java效果配置 springboot版本 <parent><groupId>org.sp…

【面试高频算法解析】算法练习2 回溯

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯双指针滑动窗口深度优先搜索…

JavaScript高级程序设计读书记录(二):语言基础,操作符,语句,函数

4. 操作符 4.1 一元操作符 只操作一个值的操作符叫一元操作符&#xff08;unary operator&#xff09;。一元操作符是 ECMAScript中最简单的操作符。 1. 递增/递减操作符 递增和递减操作符-- 直接照搬自 C 语言&#xff0c;但有两个版本&#xff1a;前缀版和后缀版。 无论使…

使用KVM命令集管理虚拟机

1、KVM基本功能管理 1&#xff09;查看命令帮助 [rootlocalhost ~]# virsh -h ......//省略输出内容 2&#xff09;查看KVM的配置文件存放目录&#xff08;rhel7.1是虚拟机系统实例的配置文件&#xff09; [rootlocalhost ~]# ls /etc/libvirt/qemu autostart networks r…

Spark内核解析-脚本解析2(六)

2、脚本解析 在看源码之前&#xff0c;我们一般会看相关脚本了解其初始化信息以及Bootstrap类&#xff0c;Spark也不例外&#xff0c;而Spark中相关的脚本如下&#xff1a; %SPARK_HOME%/sbin/start-master.sh %SPARK_HOME%/sbin/start-slaves.sh %SPARK_HOME%/sbin/start-all…

SQL中 Group by Grouping Sets 分组的用法

文章目录 1. 用法2. 语法3. 实际应用3.1 求总和与小计3.2 按多个维度分组3.3 标记小计和总计 1. 用法 将Grouping Sets 运算符添加到Group by 子句中&#xff0c;使用Grouping Set 可以在一个查询中指定数据的多个分组&#xff0c;其结果与针对指定的组执行union all 运算等效…

《设计模式》之策略模式

策略模式定义 比如对象的某个行为&#xff0c;在不同场景有不同实现方式&#xff0c;可以将这些行为的具体实现定义为一组策略&#xff0c;每个实现类实现种策略&#xff0c;在不同场景使用不同的实现&#xff0c;并且可以自由切换策略。 策略模式结构 策略模式需要一个策略…

SpringBoot的测试

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

【iOS安全】JS 调用Objective-C中WKWebview Handler的三种方式

有三种实现途径 1. WKScriptMessageHandler OC部分&#xff1a;注册并实现Handler 将OC中的方法"nativeMethod"注册为JavaScript Message Handler&#xff0c;从而WebView中的JavaScript代码可以调用该方法 // Register in Objective-C code - (void)setupWKWebVi…

table的最后一行需要加底色

<tr class"font12" v-for"(item, index) in OrderAuditDiscountList.list" :key"index":class"OrderAuditDiscountList.list.length - 1 index ? blodfont : "> 其中&#xff1a; :class"OrderAuditDiscountList.list.le…

分布式锁Lock4J 使用总结

Lok4j 简介 lock4j是一个分布式锁组件&#xff0c;其提供了多种不同的支持以满足不同性能和环境的需求。 立志打造一个简单但富有内涵的分布式锁组件。 特点 简单易用&#xff0c;功能强大&#xff0c;扩展性强。支持redission,redisTemplate,zookeeper。可混用&#xff0c…

羊大师讲解,羊奶为什么更适合高血压人群?

羊大师讲解&#xff0c;羊奶为什么更适合高血压人群&#xff1f; 高血压是一种常见的健康问题&#xff0c;它会引起诸多并发症并增加心脑血管疾病的风险。与此同时&#xff0c;人们越来越关注饮食对健康的影响。作为一种营养丰富且适合高血压人群的饮品&#xff0c;羊奶备受关…

Java版直播商城免 费 搭 建:平台规划与常见营销模式,电商源码、小程序、三级分销及详解

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…

玩转JNPF可视化平台,软件开发如此简单!

以 Vue 为技术栈的低代码 JNPF &#xff0c;开发力量还可以。这款低代码和市面上的其他低代码区别很大的&#xff0c;相较于轻流、简道云、轻宜搭、微搭、帆软、活字格等等&#xff0c;这类面向业务人群使用的低代码&#xff08;不需要研发人员操作的编写的&#xff0c;我更愿意…

spring boot dispatcherServlet注册到tomcat及tomcat请求如何找到dispatcherServlet

spring boot dispatcherServlet如何注册到tomcat容器中&#xff0c;及request请求如何在tomcat的servlet容器找到dispatcherServlet ##spring boot 注册dispatcherServlet javax.servlet.ServletContext.addServlet添加tomcat容器 ##spring boot 注册dispatcherServlet ##req…

H5C3练习心得 2024.01.04(鼠标悬停缩放效果)--box-shadow,font字体,文本样式

&#xff08;一&#xff09;box-shadow 1.作用 为盒子添加阴影 2.属性语法 box-shadow&#xff1a;h-shadow v-shadow blur spread color position h-shadow:水平阴影的的位置&#xff0c;允许负值&#xff08;必填&#xff09;v-shadow&#xff1a;垂直阴影的位置&#x…

Python 自学(四) 之元组字典与集合

目录 1. 列表&#xff0c;元组&#xff0c;字典与集合的区别 2. 元组的创建和删除 tuple() del P101 3. 单个元素的元组 P102 4. 元组元素的修改 P106 5. 元组的使用场景 6. 字典的创建和删除 dict() zip() : del clear() P1…