odoo17开发教程(4):模块module和model中的字段类型

本文介绍了如何在Odoo17中使用ORM实现数据库交互,通过创建模型和字段来存储房产相关信息,如名称、价格等,并概述了自动字段和配置选项。后续将涉及__manifest__.py文件和权限管理。
摘要由CSDN通过智能技术生成

之前的文章我们已经了解了模块的基础构成,然而,此时它仍然是一个空壳,无法存储任何数据。在我们的房地产模块中,我们希望在数据库中存储与房产相关的信息(名称、描述、价格、居住面积......)。Odoo 框架提供了促进数据库交互的工具。

对象关系映射

Odoo的一个关键组件是ORM层。该层可避免手动编写大多数 SQL,并提供可扩展性和安全服务。


业务对象被声明为扩展 Model 的 Python 类,从而将它们集成到自动持久化系统中。

模型可通过在定义中设置属性进行配置。最重要的属性是 _name,这是必填项,它定义了模型在 Odoo 系统中的名称。以下是模型的最低定义:

from odoo import models

class TestModel(models.Model):
    _name = "test_model"

这个定义足以让 ORM 生成一个名为 test_model 的数据库表。按照惯例,所有模型都位于 models 目录中,每个模型都在自己的 Python 文件中定义。
 

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。

字段分为两大类:“简单”字段(直接存储在模型表中的原子值)和“关系”字段用来链接记录(相同或不同模型的))

字段示例包括布尔、浮点、字符、文本、日期和选择(BooleanFloatCharTextDate and Selection)

我们的表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

你可以使用下面的代码真正创建一个estate_property表,新建models/estate_property.py:

from odoo import models, fields, api

class EstateProperty(models.Model):
    _name = "estate_property"
    _description = "Estate Property"
    
    name = fields.Char(required=True)
    description = fields.Text()
    postcode = fields.Char()
    date_available = fields.Date()
    expected_price = fields.Float(required=True)
    selling_price = fields.Float()
    bedrooms = fields.Integer()
    living_area = fields.Integer()
    facades = fields.Integer()  # 外墙
    garage = fields.Boolean()
    garden = fields.Boolean()
    garden_area = fields.Integer()
    garden_orientation = fields.Selection([
        ("north", "North"),
        ("south", "South"),
        ("east", "East"),
        ("west", "West"),
    ])

与模型本身一样,字段也可以通过传递配置属性作为参数来进行配置:

name = fields.Char(required=True)

有些属性适用于所有字段,以下是最常见的属性:
string(str,默认:字段名)
字段在用户界面中的标签(用户可见)。

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

help (str,默认值:'')
在用户界面中为用户提供帮助提示。

index(bool,默认值:False)
请求 Odoo 为列创建数据库索引。

自动字段

Odoo 会在所有模型中创建一些字段。这些字段由系统管理,不能写入,但如果有用或有必要,可以读取:

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

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

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

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

write_uid (Many2one)
最后修改记录的用户。

总结:

到此为止,我们模块的结构应该是下面这样(忽略pycache文件夹)

 models/__init__.py:

from . import estate_property

estate/__init__.py:

from . import models

最后重启你的容器 docker restart <container_id>

用数据库管理软件,例如pgadmin4,就能看到你新创建的表啦!
ps: 如何还看不到,找到你的模块,点击Upgrade:

上一篇文章 odoo17开发教程(3):详解__manifest__.py文件_odoo 17开发文档-CSDN博客 

下一篇文章 odoo17开发教程(5):权限的简单介绍_odoo17 权限-CSDN博客

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Odoo 是一个强大的开源企业资源计划(ERP)系统,它提供了许多内置的小部件(Widgets)用于在应用程序构建用户界面。但是,有时候这些内置小部件不能完全满足我们的需求,我们需要自定义小部件以实现更加个性化的功能。 在本教程,我将向您展示如何创建自定义小部件。我们将创建一个简单的小部件,该小部件将显示一个按钮,当用户单击它时,会将其文本转换为大写字母。 步骤1:创建模块 首先,我们需要创建一个新的Odoo模块。您可以使用Odoo Studio或手动创建一个新模块,方法是在Odoo创建一个新的文件夹,并在其创建一个__init__.py文件以及一个名为__manifest__.py的文件。 __manifest__.py文件应包含以下内容: ``` { 'name': 'Custom Widget Demo', 'version': '1.0', 'category': 'Tools', 'summary': 'Demo module for custom widget development', 'depends': ['base'], 'data': [ 'views/assets.xml', ], 'auto_install': True, } ``` 在上面的代码,我们定义了模块的名称,版本,类别,摘要和依赖项。我们还定义了一个视图文件assets.xml,稍后我们将在其定义我们的小部件。 步骤2:创建小部件 现在我们需要创建我们的自定义小部件。我们将创建一个名为CustomButton的小部件。在模块创建一个新的文件夹,名为widgets,并在其创建一个新的Python文件,名为custom_button.py。该文件将包含以下代码: ``` from odoo import fields, models class CustomButton(models.AbstractModel): _name = 'custom.button' _description = 'Custom Button Widget' text = fields.Char() def button_action(self): self.text = self.text.upper() ``` 在上面的代码,我们定义了一个名为CustomButton的抽象模型。我们还定义了一个名为text的字段,该字段将用于存储用户输入的文本。我们还定义了一个名为button_action的方法,该方法将在用户单击按钮时调用,并将文本转换为大写字母。 步骤3:定义小部件视图 现在我们需要定义小部件的视图。在模块创建一个新的文件夹,名为views,并在其创建一个名为assets.xml的新文件。文件应包含以下代码: ``` <?xml version="1.0" encoding="utf-8"?> <odoo> <template id="assets_backend" name="Custom Button Widget" inherit_id="web.assets_backend"> <xpath expr="//script[last()]" position="before"> <script type="text/javascript" src="/custom_widget_demo/static/src/js/custom_button.js"></script> </xpath> <xpath expr="//div[@class='o_form_sheet_bg']" position="inside"> <div class="o_custom_button"> <button t-attf-class="btn btn-primary o_form_button o_custom_button_button" t-attf-data-id="widget_{{widget_id}}">{{widget.text}}</button> </div> </xpath> </template> </odoo> ``` 在上面的代码,我们定义了一个名为assets_backend的模板,该模板继承自web.assets_backend。我们还在模板定义了一个包含一个按钮的div元素。按钮的文本将从小部件的text字段获取,并且在单击按钮时将调用我们在CustomButton类定义的button_action方法。 步骤4:定义JavaScript文件 最后,我们需要定义一个JavaScript文件,该文件将响应按钮的单击事件并调用Odoo RPC方法来更新小部件的text字段。在模块的static/src/js文件夹创建一个新文件,名为custom_button.js,并将以下代码添加到文件: ``` odoo.define('custom_widget_demo.custom_button', function (require) { 'use strict'; var core = require('web.core'); var Widget = require('web.Widget'); var QWeb = core.qweb; var CustomButton = Widget.extend({ template: 'CustomButton', events: { 'click .o_custom_button_button': '_onClick', }, init: function (parent, options) { this._super.apply(this, arguments); this.text = options.text || ''; }, _onClick: function () { var self = this; this._rpc({ model: 'custom.button', method: 'button_action', args: [[this.id]], }).then(function (result) { self.text = result; self.$('.o_custom_button_button').text(self.text); }); }, }); core.action_registry.add('custom_button', CustomButton); return { CustomButton: CustomButton, }; }); ``` 在上面的代码,我们定义了一个名为CustomButton的JavaScript对象,并在其定义了一个模板,该模板对应于我们在assets.xml文件定义的按钮元素。我们还定义了一个名为_onClick的方法,该方法将在按钮单击事件发生时调用。该方法通过RPC调用我们在CustomButton类定义的button_action方法,并将返回值更新小部件的text字段。 步骤5:注册小部件 最后,我们需要在模块__manifest__.py文件注册我们的小部件。我们将在data部分添加以下代码: ``` 'qweb': [ 'static/src/xml/custom_button.xml', ], ``` 现在,我们已经成功地创建了一个自定义小部件。要使用它,请在Odoo创建一个新的表单视图,并将小部件添加到该视图。在视图,您可以看到一个具有文本输入框和一个转换文本为大写字母的按钮的小部件。 总结 在本教程,我向您展示了如何使用Odoo开发自定义小部件。通过创建自己的小部件,您可以为Odoo应用程序添加更加个性化的功能,并满足特定业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值