odoo17 | 模型和基本字段

前言

在上一章的最后,我们能够创建一个Odoo模块。然而,在这一点上,它仍然是一个空壳,不允许我们这样做 存储任何数据。在我们的房地产模块中,我们希望存储与 数据库中的属性(名称、描述、价格、居住面积等)。Odoo框架提供 促进数据库交互的工具。

在继续练习之前,请确保已安装estate房地产模块,即 必须在“应用”列表中显示为“已安装”。(点击启动即可)
在这里插入图片描述

模型对象关系映射

目标:使用odoo模型在数据库中创建表:estate_property

$ psql -d rd-demo
rd-demo=# SELECT COUNT(*) FROM estate_property;
count
-------0
(1 row)
  • Odoo的一个关键组件是ORM层。 该层避免了手动编写大多数 SQL,并提供可扩展性和安全性服务。
  • 业务对象被声明为扩展Model的Python类,后者将它们集成到自动化持久化系统中。
  • 可以通过在模型定义中设置属性来配置模型。最重要的属性是_name,它是必需的,并定义了Odoo系统中模型的名称。这是一个模型的最小定义:
from odoo import modelsclass EstateProperty(models.Model):_name = 'estate.property'_description = '房地产模块'
  • 这个定义足以让ORM生成一个名为estate_property的数据库表。按照惯例,所有模型都位于models目录中,每个模型都在自己的Python文件中定义。
  • _name = ‘estate.property’ 标识的是模型名称,会在posgres数据库中转化为estate_property表
  • _description = ‘房地产模块’ 是模型的描叙信息,可以不写,但是不写的话,启动会出现警告信息。

模型字段

字段用于定义模型可以存储的内容及其存储位置。字段是在模型类中定义为属性:
简单代码示例

from odoo import models,fieldsclass EstateProperty(models.Model):_name = 'estate.property'_description = '房地产模块'name = fields.Char()
  • name字段是一个Char,它将被表示为Python unicode str(即对象的属性)和SQL VARCHAR(即在数据库estate_property 增加名为name类型为VARCHAR的字段)。

模型是如何定义的,以及对应的 Python 是如何定义的文件导入

  • 模型在文件estate/models/estate_property.py中定义(代码如下)
from odoo import models,fieldsclass EstateProperty(models.Model):_name = 'estate.property'_description = '房地产模块'name = fields.Char()
  • 在estate/models/__init__.py中导入文件crm_recurring_plan.py(见这里)
from . import estate_property
  • 在estate/__init__.py中导入文件夹模型(见这里)
from . import models

字段类型

字段有两大类:

  • “简单”的基本字段,它们是直接存储在模型表中的原子值
  • 以及“关系”字段,它们链接(相同或不同模型的)记录(后面会讲到模型的关系字段)。

简单的字段示例有Boolean, Float, Char, Text, DateSelection

目标:按照下图将几个基本字段添加到表中:estate_property中

 Column       |            Type             | Collation | Nullable |                  Default
--------------------+-----------------------------+-----------+----------+---------------------------------------------
id                 | integer                     |           | not null | nextval('estate_property_id_seq'::regclass)
create_uid         | integer                     |           |          |
create_date        | timestamp without time zone |           |          |
write_uid          | integer                     |           |          |
write_date         | timestamp without time zone |           |          |
name               | character varying           |           |          |
description        | text                        |           |          |
postcode           | character varying           |           |          |
date_availability  | date                        |           |          |
expected_price     | double precision            |           |          |
selling_price      | double precision            |           |          |
bedrooms           | integer                     |           |          |
living_area        | integer                     |           |          |
facades            | integer                     |           |          |
garage             | boolean                     |           |          |
garden             | boolean                     |           |          |
garden_area        | integer                     |           |          |
garden_orientation | character varying           |           |          |
Indexes:"estate_property_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:"estate_property_create_uid_fkey" FOREIGN KEY (create_uid) REFERENCES res_users(id) ON DELETE SET NULL"estate_property_write_uid_fkey" FOREIGN KEY (write_uid) REFERENCES res_users(id) ON DELETE SET NULL

完整代码如下:

from odoo import models, fieldsclass EstateProperty(models.Model):_name = 'estate.property'_description = '房地产模块'name = fields.Char(string="名称")description = fields.Text(string="描述")postcode = fields.Char(string="邮编")date_availability = fields.Date(string="可用时间")expected_price = fields.Float(string="预期价格")selling_price = fields.Float(string="销售价格")bedrooms = fields.Integer(string="卧室")living_area = fields.Integer(string="居住面积")facades = fields.Integer(string="外立面(外墙)")garage = fields.Boolean(string="是否有车库")garden = fields.Boolean(string="是否有花园")garden_area = fields.Integer(string="花园面积")garden_orientation = fields.Integer(string="花园朝向")

通用属性

例如 是name字段 不能为空
与模型本身非常相似,字段可以通过传递 作为参数的配置属性:

name = fields.Char(required=True)

某些属性在所有字段上都可用,以下是最常见的属性:
string (str, default: 字段名称)
UI中字段的标签(用户可见)。

required (bool, default: False)
如果为True,则该字段不能为空。它必须有一个默认值,或者在创建记录时总是给定一个值。

help (str, default: ‘’)
在UI中为用户提供长篇帮助工具提示。

index (bool, default: False)
请求Odoo在数据库字段列上创建数据库索引。

自动字段

你可能已经注意到你的模型中有一些你从未定义过的字段。Odoo在所有模型中自动创建一些字段。这些字段由系统管理,不能写入,但如果有需要,可以读取。以下是Odoo在所有模型自动创建的字段:

id (id)
模型记录的唯一标识符。

create_date (Datetime)
记录的创建日期。

create_uid (Many2one)
创建记录的用户。

write_date (Datetime)
记录的最后修改日期。

write_uid (Many2one)
上次修改记录的用户。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【BIG_FG_CSDN】C++ 数组与指针 (个人向——学习笔记)

一维数组 在内存占用连续存储单元的相同类型数据序列的存储。 数组是静态存储器的块;在编译时确定大小后才能使用; 其声明格式如下: 元素类型 数组名[常量];元素类型:数组中元素的数据类型; 常量&#…

Python 自学(二) 之流程控制语句

目录 1. if ... elif ... else 语句 P62 1. if ... elif ... else 语句 P62 每个判断语句后面要加 :elif 的写法比较特别

【搜索引擎】elastic search核心概念

前言 本文不涉及ES的具体安装下载、操作、集群的内容,这部分内容会放在后面一篇文章中。本文只包含ES的核心理论,看完本文再去学ES的细节会事半功倍。 目录 1.由日志存储引出的问题 2.什么是ES? 3.ES的数据结构 4.ES的核心原理 5.联系作…

iOS问题记录 - iOS 17通过NSUserDefaults设置UserAgent无效(续)

文章目录 前言开发环境问题描述问题分析1. 准备源码2. 定位源码3. 对比源码4. 分析总结 解决方案补充内容1. UserAgent的组成2. UserAgent的设置优先级 最后 前言 在上篇文章中对该问题做了一些判断和猜测,并给出了解决方案。不过,美中不足的是没有进一…

Peter算法小课堂—动态规划

Peter推荐算法书:《算法导论》 图示: 目录 钢条切割 打字怪人 钢条切割 算法导论(第四版)第十四章第一节:钢条切割 题目描述: 给定一根长度为 n 英寸的钢条和一个价格表 ,其中 i1,2,…,n …

LaTeX写论文,公式后段落取消缩进方法:\noindent

在论文的段落中,需要插入一个公式,按道理公式后应该紧接着是段落的文本内容,但如果直接写的话,编译得到的PDF中呈现出来的却是开头缩进的样子 如果需要取消公式后面的段落缩进,可以使用命令 \noindent 该命令的作用…

十年磨一剑,花为缘享奢app打造行业的又一颠覆性创新

随着国内生活质量的提高,人们对于奢侈品的消费需求也在不断增长。消费者对于高品质、高价值的商品和服务的需求日益增长。2022年我国内地消费者奢侈品市场规模约为4700亿元,预计2023年我国内地消费者奢侈品消费预计将达到5500亿元,呈现出强劲…

华为鸿蒙运行Hello World

前言: 从11月中旬开始通过B站帝心接触鸿蒙,至今一个半月左右不到,从小白到入坑,再到看官网案例,分析案例,了解技术点,还需要理清思路,再写博客,在决定写 <Har…

MessageBox:连接HubSpot和微信的桥梁

在当今充满挑战的商业环境中,成功的企业需要高效整合不同的平台和系统,以提升客户关系管理的水平。在这一复杂的任务中,MessageBox凭借其卓越的功能和灵活性,不仅成为连接HubSpot和微信的桥梁,更是实现精细化客户关系的…

【Spark精讲】SparkSQL的RBO与CBO

Spark SQL核心:Catalyst Spark SQL的核心是Catalyst查询编译器,它将用户程序中的SQL/Dataset/DataFrame经过一系列操作,最终转化为Spark系统中执行的RDD。 Catalyst组成部分 Parser :用Antlr将SQL/Dataset/DataFrame转化成一棵未经解析的树…

PowerBI:如何在以SharePoint文件做为数据源?

问题描述: 有朋友最近询问,在PowerBI中如何以SharePoint中的文件做为数据源,进行报告的设计开发? 今天抽一些时间,为大家做一个样例,供大家参考。 解决方案: 找到将要使用的SharePoint中文件…

计算字符串的长度几种方法 | 递归 | 指针减指针 | 计数器 | C语言 | 详解 | 期末考试必看!!!

一,使用 递归 计算 字符串 的 长度 1,题目描述 2,分析题目 Ⅰ,题目中要求除了函数的形参,函数中不能够使用多余的变量(这是比较苛刻的要求)。 Ⅱ,根据此,很自然的…