今天遇到了非常规表的创建及使用,来分享一下

使用场景:展示表用到了其他两个表的字段,并且想要对这俩表的字段进行一个操作

以下为展示表的代码

# -*- coding: utf-8 -*-
from odoo import api, models, fields, toolsclass ReceiptFollowUp(models.Model):_name = 'receipt.follow.up'_description = '收款跟进'_auto = Falsesalesman = fields.Char('业务员')department = fields.Char('部门')contract_no = fields.Char('合同编号')contract_name = fields.Char('合同名称')subordinate_company = fields.Char('所属公司')partner_name = fields.Char('客户名称')contract_amount = fields.Float('合同金额')receipt_stage = fields.Char(string='收款阶段')plan_receipt_date = fields.Date(string='计划收款日期')stage_payback_amount = fields.Float(string='阶段回款金额')received_amount = fields.Float('已收款金额')unreceived_amount = fields.Float(string='未收款金额')forecast_receipt_date = fields.Date('预测收款日期')forecast_receipt_amount = fields.Float('预测收款金额')submit_state = fields.Selection([('unsubmitted', '未提交'), ('submitted', '已提交')], string='提交状态')receive_plan_id = fields.Integer('收款计划id')def action_model_view(self):return {'type': 'ir.actions.act_window','view_type': 'form','view_mode': 'form','res_model': 'sales.contract','res_id': self.env['sales.contract'].search([('c_cust_contract_no', '=', self.contract_no)])[0].id,}@api.modeldef btn_confirm_submission(self,select_ids):for record in select_ids:self_id = self.env['receipt.follow.up'].search([('id', '=', record)],limit=1)plan_id = self.env['sales.contract.receive.plan'].search([('id', '=', self_id.receive_plan_id)],limit=1)if plan_id:plan_id.write({'submit_state': 'submitted'})def init(self):tools.drop_view_if_exists(self._cr, self._table)self._cr.execute(f"""CREATE OR REPLACE VIEW {self._table} AS (SELECT T2.id,t1.emp_id                   as salesman,t1.emp_dept_id              as department,t1.c_cust_contract_no     as contract_no,t1.proj_name             as contract_name,t1.emp_org_id              as subordinate_company,t1.c_cust_id             as partner_name,t1.pb_amount                as contract_amount,t2.receive_stage_id          as receipt_stage,t2.plan_receive_date       as plan_receipt_date,t2.stage_receive_amount        as stage_payback_amount,t2.receive_amount           as received_amount,t2.no_receive_amount     as unreceived_amount,t2.plan_receive_date       as forecast_receipt_date,t2.no_receive_amount       as forecast_receipt_amount,t2.submit_state,t2.id                       as receive_plan_idFROM sales_contract T1 INNER JOIN sales_contract_receive_plan T2 on t1."id" = t2.sales_contract_idORDER BY T1.id,T2.id)""")

先定义模型,注意需要设定_auto = False,这样odoo就不会自动创建表及其字段,然后字段就正常定义就好,不需要写逻辑,因为后边会用sql语句对其赋值

btn_confirm_submission为按钮调用的反写方法,直接对主表write对应内容就好了

第二步定义xml

<?xml version="1.0" encoding="UTF-8" ?>
<odoo><data><record id="receipt_follow_up_tree" model="ir.ui.view"><field name="name">receipt.follow.up.tree</field><field name="model">receipt.follow.up</field><field name="arch" type="xml"><tree create="0" limit="500" delete="false"><field name="salesman" optional="show"/><field name="department" optional="show"/><field name="contract_no" optional="show"/><field name="contract_name" optional="show"/><field name="subordinate_company" optional="show"/><field name="partner_name" optional="show"/><field name="contract_amount" optional="show"/><field name="receipt_stage" optional="show"/><field name="plan_receipt_date" optional="show"/><field name="stage_payback_amount" optional="show"/><field name="received_amount" optional="show"/><field name="unreceived_amount" optional="show"/><field name="forecast_receipt_date" optional="show"/><field name="forecast_receipt_amount" optional="show"/><field name="submit_state" optional="show"/></tree></field></record><record id="receipt_follow_up_search" model="ir.ui.view"><field name="model">receipt.follow.up</field><field name="arch" type="xml"><search string="收款跟进"><field name="salesman"/><field name="department"/><field name="contract_no"/><field name="contract_name"/></search></field></record><!--窗口动作--><record id="receipt_follow_up_action" model="ir.actions.act_window"><field name="name">收款跟进</field><field name="res_model">receipt.follow.up</field><field name="view_mode">tree</field><field name="help" type="html"><p class="oe_view_nocontent_create">创建您的收款跟进</p></field></record><menuitem id="receipt_follow_up_menu" name="收款跟进" parent="payback_forecast_menu" sequence="1"action="receipt_follow_up_action"/></data>
</odoo>

定义tree,search视图,action及menuitem,与正常表无差别

还有一种情况就是反写的内容不是固定的可怎么办呢:

可以在tree视图最后增加button来调用后端方法

效果如下

    def btn_operation_update(self):"""收款变更按钮:return:"""return {'name': '收款变更','type': 'ir.actions.act_window','res_model': 'receipt.change.transient','view_mode': 'form','target': 'new','context': {'forecast_receipt_date': self.forecast_receipt_date, 'forecast_receipt_amount': self.forecast_receipt_amount,'receive_plan_id': self.receive_plan_id}}

后端方法来返回一个transient模型的form视图,transient模型是用来计算值的中间表,context中可以传入现在状态的一些数据,注意他不储存数据,只能用这些数据来计算并返回,下面是我定义的transient模型

from odoo import models, fields
from odoo.exceptions import ValidationErrorclass ReceiptChangeTransient(models.TransientModel):_name = 'receipt.change.transient'_description = '收款变更 transient'forecast_receipt_date = fields.Date('预测收款日期')forecast_receipt_amount = fields.Float('预测收款金额')def confirm_change(self):receive_plan_id = self._context.get('receive_plan_id')plan_id = self.env['sales.contract.receive.plan'].search([('id', '=', receive_plan_id)], limit=1)if plan_id:plan_id.write({'plan_receive_date': self.forecast_receipt_date,'no_receive_amount': self.forecast_receipt_amount})else:raise ValidationError('没有找到对应的收款计划!')

我只需要计算两个字段,所以只定义了这两个字段,confirm_change是确认按钮的方法,来实现回写,下面是transient模型的form视图

<?xml version='1.0' encoding='utf-8'?>
<odoo><data noupdate="0"><record id="receipt_change_transient_form_view" model="ir.ui.view"><field name="name">收款变更wizard</field><field name="model">receipt.change.transient</field><field name="arch" type="xml"><form style="text-align: center"><sheet><group><group><field name='forecast_receipt_date' string='预测收款日期'/></group><group><field name='forecast_receipt_amount' string='预测收款金额'/></group></group><footer><button string="确认变更" name="confirm_change" type="object" class="btn btn-primary"/><button string="取消" class="btn btn-default" special="cancel"/></footer></sheet></form></field></record></data>
</odoo>

确认变更按钮来调用后端的confirm_change来实现回写逻辑,效果如下:

点击确认变更按钮效果如下,可以发现这俩字段的值已经变了,说明主表的这俩字段已经回写成功(这里其实就是主表的字段,只是用来展示) 

至此结束

views表解释:

在Odoo中,模型(Model)在数据库中通常被映射为表(Table),而不是视图(View)。模型对应的表用于存储与模型相关的数据,包括模型定义的字段和相关记录。

然而,有时候会有一些特殊情况,某些模型在数据库中会被映射为views表,而不是实际的数据表。这通常发生在具有动态或计算字段的模型上。

当一个模型定义了动态或计算字段时,这些字段的值是根据其他字段的计算结果动态生成的,而不是直接存储在数据库中。因此,对于这些模型,不需要在数据库中创建对应的数据表来存储字段的值。

相反,这些模型的数据是通过视图(View)来呈现和计算的。这些视图定义了模型字段的计算逻辑和展示方式,以及如何将数据显示给用户。这些视图在运行时根据模型的定义动态生成,并在访问模型数据时执行相应的计算。

所以,当一个模型在数据库中被映射为views表时,它表示该模型的数据是通过视图计算和呈现的,而不是存储在实际的数据表中。这种做法使得可以在不存储实际字段值的情况下,动态地计算和展示数据,并在需要时提供准确的计算结果。

odoo定义view表自定义sql来创建表及反写操作相关推荐

  1. 通过SQL命令创建表、删除表(二)

    通过SQL命令创建表.删除表 创建表命令 --emp表(员工表) create table emp (empno int primary key,ename nvarchar(200),job nva ...

  2. SQL Server创建表和添加列

    撰写时间:2022 年 4 月 27日 SQLServer创建表和添加列 SQL Server创建表: 表用于在数据库中存储数据:表在数据库和模式中唯一命名.每个表包含一个或多个列.每列都有一个相关的 ...

  3. 使用SQL Server创建表

    使用SQL Server创建表 一.CREATE TABLE语句简介: 表用于在数据库中存储数据. 表在数据库和模式中唯一命名. 每个表包含一个或多个列. 每列都有一个相关的数据类型,用于定义它可以存 ...

  4. --SQL code# --创建表及字段描述信息

    --SQL code# --创建表及描述信息      create   table   表(a1   varchar(10),a2   char(2)) --为表添加描述信息   EXECUTE   ...

  5. ACCESS数据库使用sql语句创建表

    在Access中使用sql语句创建表时指定字段类型 长度为255的文本varchar 长度为20的文本varchar(20) 日期时间datetime 数字byte或smallint或integer, ...

  6. SQL语句创建表并添加数据

    SQL语句创建表并添加数据 创建表 use school 指定要用的数据库 go create table student 创建表 ( ID bigint identity(1,1), 添加ID,id ...

  7. 如何用sql语句创建表

    如何用sql语句创建表 创建一个logging表 create table logging ( id int primary key, title varchar(20), actice varcha ...

  8. SQL Sever2012 创建表时发生“未指定错误”解决方法

    @[TOC]( SQL Sever2012 创建表时发生"未指定错误"解决方法 下载SQL2012,界面一般,而且从第二次使用时就发现,第一次创建的数据库都打不开,说是什么位置移动 ...

  9. 使用sql语句创建表、修改表、添加列等

    使用sql语句创建表.修改表.添加列等 原文链接 创建表: CREATE TABLE 学生信息 ( 学号 varchar(14) IDENTITY(1,1) PRIMARY KEY, 姓名 varch ...

最新文章

  1. OpenCvSharp中CV_8UC1,CV_8UC2等参数的解释
  2. 2021-11-22--中标麒麟-Linux系统扩容根目录磁盘空间
  3. solidworks图纸模板添加_Solidworks零件和图纸绘制流程分享
  4. ~~约数之和(附模板题)
  5. [转载] Numpy 数学函数及逻辑函数
  6. Ninth scrum meeting - 2015/11/3
  7. AutoCAD 2019 for mac汉化版
  8. 怒肝3W字Java学习路线!从入门到封神全包了(建议收藏)
  9. python为什么会出现无响应怎么办,Python多处理中无响应进程的终止
  10. stm32下OLED屏的应用
  11. php蘑菇街商城源码,php源码:dedecms精仿蘑菇街(mogujie.com)源码,时尚购物社区源码...
  12. Android手机导出的已安装的APK到电脑
  13. 大工21春《土木工程实验(二)》实验报告
  14. 防止机械/移动硬盘休眠 - NoSleepHD
  15. 微星GE62 2QC-264XCN刷黑苹果详细教程亲测有效,完美双系统,双屏!
  16. 多商家商城系统有哪些功能
  17. 从零开始搭建自己的云服务器
  18. 电机磁电热多场耦合 matlab,永磁电机电磁-温度场耦合仿真分析流程
  19. 基于Arduino的显示测量环境数据设计
  20. c语言程序的基本单位是什么呢?

热门文章

  1. C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法【转】
  2. 爱美眉aimeimei.pw整站下载、2G图片、上万数据
  3. linux万能显卡,Linux N卡驱动年终盘点:干得漂亮
  4. 网站备案靠谱吗_域名快速备案靠谱吗
  5. 价值20k的sql题(java中级)
  6. ai模仿声音软件_利用人工智能技术模仿CEO的声音进行了诈骗
  7. 区间(interval)
  8. 物料管理系统最基本的功能有哪些?
  9. php 读取cookieid,代码审计:TinyShop网店系统漏洞审计过程分享
  10. 2018最新动脑学院java全集