首页 > 其他分享 >odoo 开发入门教程系列-模型和基本字段

odoo 开发入门教程系列-模型和基本字段

时间:2023-06-11 12:37:40浏览次数:53  
标签:estate models fields 模型 入门教程 odoo import model

模型和基本字段

在上一章的末尾,我们创建一个odoo模块。然而,此时它仍然是一个空壳,不允许我们存储任何数据。在我们的房地产模块中,我们希望将与房地产相关的信息(名称(name)、描述(description)、价格(price)、居住面积(living area)…)存储在数据库中。odoo框架提供了数据库交互的工具

开始练习前,请确保estate模块已被安装,也就是说必须以installed的状态出现在Apps列表中,如下

odoo 开发入门教程系列-模型和基本字段_python

对象关系映射(Object-Relational Mapping)

参考: 和本主题关联文档可参考 Models API.

ORM 层是odoo的一个关键组件。该层避免了手动写入大部分SQL并提供可扩展性和安全服务.

业务对象被定义为继承于 Model的Python类。可以通过在定义中设置属性来配置model。最重要的属性为 _name,该属性定义了model在odoo系统中的属性。以下为model的最小化定义:

from odoo import models

class TestModel(models.Model):
    _name = "test.model"

该定义足够ORM生成一张名为test_model的表。model _name中的 . 会被ORM自动化转为_ 。按约定所有的model位于一个名为 models 的目录,并且每个mode被定义为一个Python文件。

来看下 crm_recurring_plan 表是怎么定义的,以及对应Python文件是怎么导入的:

  1. odoo/addons/crm/models/crm_recurring_plan.py 中定义model(源码链接)
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from odoo import fields, models


class RecurringPlan(models.Model):
    _name = "crm.recurring.plan"
    _description = "CRM Recurring revenue plans"
    _order = "sequence"

    name = fields.Char('Plan Name', required=True, translate=True)
    number_of_months = fields.Integer('# Months', required=True)
    active = fields.Boolean('Active', default=True)
    sequence = fields.Integer('Sequence', default=10)

    _sql_constraints = [
        ('check_number_of_months', 'CHECK(number_of_months >= 0)', 'The number of month can\'t be negative.'),
    ]
  1. crm/models/__init__.py中导入crm_recurring_plan.py (源码链接)
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from . import res_users
from . import calendar
from . import crm_lead
from . import crm_lost_reason
from . import crm_stage
from . import crm_team
from . import ir_config_parameter
from . import res_config_settings
from . import res_partner
from . import digest
from . import crm_lead_scoring_frequency
from . import utm
from . import crm_recurring_plan
  1. crm/__init__.py中导入models包 (源码链接)
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from . import controllers
from . import models
from . import report
from . import wizard

from odoo import api, SUPERUSER_ID

练习

创建estate_property表的最小化模型

  1. odoo14/custom/estate/models/estate_property.py 中定义model
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from odoo import model

class EstateProperty(models.Model):
    _name = 'estate.property'
  1. estate_property.pyodoo14/custom/estate/models/__init__.py中导入
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from . import estate_property
  1. estate/__init__.py中导入 models
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from . import models

重启odoo服务

python odoo-bin --addons-path=custom,odoo/addons -r myodoo -w test123 -d odoo -u estate

-u estate 表示更新 estate 模块,也就是说ORM将应用数据库模式变更。

启动过程中可以看到类似以下告警日志:

...
2022-12-14 06:46:02,771 23792 WARNING odoo odoo.models: The model estate.property has no _description 
2022-12-14 06:46:02,920 23792 WARNING odoo odoo.models: The model estate.property has no _description 
...
2022-12-14 06:46:03,498 23792 WARNING odoo odoo.modules.loading: The model estate.property has no access rules, consider adding one...
...
...

以防万一,可以看下到数据库看下表是否创建成功。pgAmin查看路径:Servers -> PostgreSQL 12 -> Databases (x) ->数据库名 -> Schemas -> public -> Tables

模型字段(Model Fields)

参考: 该主题相关文档可参考 Fields API

字段用于定义model可以存储啥及在哪里存储。 Fields被定义为model类的属性:

from odoo import fields, models

class TestModel(models.Model):
    _name = "test.model"
    _description = "Test Model"

    name = fields.Char()

name 字段被定义为Char,代表Python unicode的 str 和SQL的 VARCHAR.

有两大类领域字段:‘简单’字段--直接存储在模型表中的原子值,形如Boolean, Float, Char, Text, DateSelection, ‘关系型’ 字段--连接相同或者不同模型的记录。

给模型表estate_property添加字段

添加以下字段到表中

Field

Type

name

Char

description

Text

postcode

Char

date_availability

Date

expected_price

Float

selling_price

Float

bedrooms

Integer

living_area

Integer

facades

Integer

garage

Boolean

garden

Boolean

garden_area

Integer

garden_orientation

Selection

The garden_orientation 字段必须有4种可选值:‘North’, ‘South’, ‘East’ 和‘West’。Selection(选择列表)定义为元组列表,查看示例

修改odoo14/custom/estate/models/estate_property.py文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from odoo import models,fields


class EstateProperty(models.Model):
    _name = 'estate.property'
    _description = 'estate property table'

    name = fields.Char(size=15)
    description = fields.Text()
    postcode = fields.Char(size=15)
    date_availability = fields.Datetime('Availability Date')
    expected_price = fields.Float('expected price', digits=(8, 2)) # 最大8位,小数占2位
    selling_price = fields.Float('selling price', digits=(8, 2))
    bedrooms = fields.Integer()
    living_area = fields.Integer()
    facades = fields.Integer()
    garage = fields.Boolean('garage')
    garden = fields.Boolean('garden')
    garden_area = fields.Integer()
    garden_orientation = fields.Selection(
        string='Orientation',
        selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('West','West')],
        help="garden orientation"
    )

重启odoo服务

python odoo-bin --addons-path=custom,odoo/addons -r myodoo -w test123 -d odoo -u estate

数据库中验证

odoo 开发入门教程系列-模型和基本字段_python_02

常见属性

现在假设要求 nameexpected_price字段值不为null,所以需要对其修改,如下,添加字段属性配置required=True

name = fields.Char(required=True)
expected_price = fields.Float('expected price', digits=(8, 2),  required=True) # 最大8位,小数占2位

修改后重启odoo服务。

有些属性是所有字段都拥有的,最常见的几个属性如下:

  • string (str, default: 字段名称)
    UI上显示为字段的label (用户可见).
  • required (bool, default: False)
    如果为 True, 表示该字段值不能为空。创建记录时必须拥有默认值或给定的值。
  • help (str, default: '')
    UI上为用户提供long-form 帮助提示
  • index (bool, default: False)
    要求odoo在该列上创建数据库索引

自动创建的字段(Automatic Fields)

参考: 该话题相关文档可参考 Automatic fields.

odoo会在所有model(当然,也可以配置禁止自动创建某些字段)中创建少数字段。这些字段有系统管理并且不能写,但是可以读取,如果必要的话:

  • id (Id)
    model记录的唯一标识
  • create_date (Datetime)
    记录创建日期
  • create_uid (Many2one)
    记录创建人
  • write_date (Datetime)
    记录最后修改时间
  • write_uid (Many2one)
    记录最后修改人

作者:授客


Git地址:https://gitee.com/ishouke

友情提示:限于时间仓促,文中可能存在错误,欢迎指正、评论!

标签:estate,models,fields,模型,入门教程,odoo,import,model
From: https://blog.51cto.com/shouke/6457399

相关文章

  • odoo 开发入门教程系列-一个新应用
    一个新应用房地产广告模块假设需要开发一个房地产模块,该模块覆盖未包含在标准模块集中特定业务领域。以下为包含一些广告的主列表视图form视图顶层区域概括了房产的重要信息,比如name,PropertyType,Postcode等等。列表记录详情页中,第一个tab包含了房产的描述信息,比如:bedrooms,Livi......
  • odoo context上下文用法总结
    环境odoo-14.0.post20221212.tarcontext用法总结获取上下文>>>self.env.context#返回字典数据,等价于self._context{'lang':'en_US','tz':'Europe/Brussels'}>>>self._context{'lang':'en_US',&......
  • odoo14在tree、kanban视图上添加dashboard
    效果图:  实现代码:js:view的类型原来1个js给拆分成了4个:view,controller,renderer,model​​1、view:AbstractView​​的子类,这是工厂类:类需要解析 ​​arch​​字段并设置其它3个类2、Renderer:渲染器,来自 ​​AbstractRenderer:负责在用户界面中展示数据;​​3、Contr......
  • Odoo 通过Javascript调用模型中自定义方法
    实践环境Odoo14.0-20221212(CommunityEdition)代码实现在js脚本函数中调用模型中自定义方法:this._rpc({model:'demo.wizard',//模型名称,即模型类定义中_name的值method:'action_select_records_via_checkbox',//模型中自定义名称args:['arg_value......
  • odoo16弹出对话框中显示SearchPanel
    在odoo中,有些数据模型的Search视图可能会定义关于SearchPanel的部分,但这部分定义不会在弹出对话框中显示。如员工的list视图显示如下: 但如果我们在一个挑选员工的弹出对话框中,显示是这样子的。 这样如果员工较多,我们还要进一步输入搜索条件来进行过虑,不太方便操作。那如果......
  • WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(5)
    WPF入门教程系列目录WPF入门教程系列二——Application介绍WPF入门教程系列三——Application介绍(续)WPF入门教程系列四——Dispatcher介绍WPF入门教程系列五——Window介绍WPF入门教程系列十一——依赖属性(一)WPF入门教程系列十五——WPF中的数据绑定(一)  添加Cl......
  • R语言中的隐马尔可夫HMM模型实例|附代码数据
    原文链接:http://tecdat.cn/?p=17592最近我们被客户要求撰写关于隐马尔可夫HMM模型的研究报告,包括一些图形和统计输出。最近,我们使用隐马尔可夫模型开发了一种解决方案,并被要求解释这个方案HMM用于建模数据序列,无论是从连续概率分布还是从离散概率分布得出的。它们与状态空间和......
  • 【视频】随机波动率SV模型原理和Python对标普SP500股票指数预测|数据分享|附代码数据
    全文链接:http://tecdat.cn/?p=22546最近我们被客户要求撰写关于随机波动率SV模型的研究报告,包括一些图形和统计输出。什么是随机波动率?随机波动率(SV)是指资产价格的波动率是变化的而不是恒定的“随机”一词意味着某些变量是随机确定的,无法精确预测。在金融建模的背景下,随......
  • JavaScript学习笔记:Web安全模型
    为了保证安全,浏览器中的JavaScript不能读写设备中的文件,也不能访问任意的服务器。同源策略同源策略指的是脚本只能访问与包含它的文档同源资源。源是指文档URL中的协议、主机与端口部分,完全相同则是同源,任意一项不同都不是同源。脚本文件的URL与同源策略毫不相干,同源策略至于......
  • 3.3 模型选择和调优(KNN)
    1.什么是交叉验证(crossvalidation)交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成5份,其中一份作为验证集。然后经过5次(组)的测试,每次都更换不同的验证集。即得到5组模型的结果,取平均值作为最终结果。又称5折交叉验证。我们之前知道数据分为训练集和测试集,......