ORM-1 字段默认值

  当在odoo页面新建一条记录的时候,前端会通过rpc调用后端模型的default_get 函数,根据前端传入的字段列表,来获取相对应的字段默认值。
	# odoo/models.py@api.modeldef default_get(self, fields_list):""" default_get(fields_list) -> default_valuesReturn default values for the fields in ``fields_list``. Defaultvalues are determined by the context, user defaults, and the modelitself.:param list fields_list: names of field whose default is requested:return: a dictionary mapping field names to their corresponding default values,if they have a default value.:rtype: dict.. note::Unrequested defaults won't be considered, there is no need to return avalue for fields whose names are not in `fields_list`."""defaults = {}parent_fields = defaultdict(list)ir_defaults = self.env['ir.default'].get_model_defaults(self._name)for name in fields_list:# 1. look up contextkey = 'default_' + nameif key in self._context:defaults[name] = self._context[key]continue# 2. look up ir.defaultif name in ir_defaults:defaults[name] = ir_defaults[name]continuefield = self._fields.get(name)# 3. look up field.defaultif field and field.default:defaults[name] = field.default(self)continue# 4. delegate to parent modelif field and field.inherited:field = field.related_fieldparent_fields[field.model_name].append(field.name)# convert default values to the right format## we explicitly avoid using _convert_to_write() for x2many fields,# because the latter leaves values like [(Command.LINK, 2),# (Command.LINK, 3)], which are not supported by the web client as# default values; stepping through the cache allows to normalize# such a list to [(Command.SET, 0, [2, 3])], which is properly# supported by the web clientfor fname, value in defaults.items():if fname in self._fields:field = self._fields[fname]value = field.convert_to_cache(value, self, validate=False)defaults[fname] = field.convert_to_write(value, self)# add default values for inherited fieldsfor model, names in parent_fields.items():defaults.update(self.env[model].default_get(names))return defaults

1、该函数的作用

    函数文档说的很清楚了,我在赘述一遍。该函数根据传入的字段名返回响应的默认值,默认值是由context,用户定义以及模型本身决定的。输入参数: field_list  字段名称列表。返回值: 一个字典,key是字段名称,value是该字段的默认值注意: 该函数只返回请求列表中的字段的默认值。至于有哪些字段,是由前端视图决定的。

2、设置默认值的四种方式

从代码中可以看到,获取字典的默认值,按照优先级有四种方式:

2.1 上下文context

action

        <record id="action_move_out_invoice_type" model="ir.actions.act_window"><field name="name">Invoices</field><field name="res_model">account.move</field><field name="view_mode">tree,kanban,form</field><field name="view_id" ref="view_out_invoice_tree"/><field name="search_view_id" ref="view_account_invoice_filter"/><field name="domain">[('move_type', '=', 'out_invoice')]</field><field name="context">{'default_move_type': 'out_invoice'}</field><field name="help" type="html"><p class="o_view_nocontent_smiling_face">Create a customer invoice</p><p>Create invoices, register payments and keep track of the discussions with your customers.</p></field></record>

2.2 ir.default

@api.modeldef get(self, model_name, field_name, user_id=False, company_id=False, condition=False):""" Return the default value for the given field, user and company, or``None`` if no default is available.:param model_name::param field_name::param user_id: may be ``False`` for all users, ``True`` for thecurrent user, or any user id:param company_id: may be ``False`` for all companies, ``True`` forthe current user's company, or any company id:param condition: optional condition that restricts theapplicability of the default value; this is anopaque string, but the client typically usessingle-field conditions in the form ``'key=val'``."""if user_id is True:user_id = self.env.uidif company_id is True:company_id = self.env.company.idfield = self.env['ir.model.fields']._get(model_name, field_name)default = self.search([('field_id', '=', field.id),('user_id', '=', user_id),('company_id', '=', company_id),('condition', '=', condition),], limit=1)return json.loads(default.json_value) if default else None

从代码看, 可以对模型中的某一字典,根据不同的用户、公司、条件设置不同的默认值。
但是实际开发中很少用。

2.3 字段的默认值

这是最常见的设置默认值的一种方式
有三种设置方法:
1、 直接设置

active = fields.Boolean(default=True)

2、设置为一个函数

example_date = fields.Date(string='Date example', default=_default_example_date, store=False)

3 设置为lamda函数

 user_id = fields.Many2one('res.users', default= lambda self: self.env.user) 

2.4 通过委托继承的父表的默认值(_inherits)

关于委托继承,这里就不具体描述了。 简单理解就是数据存储在父表中,但是可以当自己的字段用。
通过一个many2one字段进行关联。

3 重写default_get

某些场景下,我们可以model中重写这个函数,加上我们自己的逻辑,比如:

    def default_get(self, fields_list):# 先调用父类方法defaults = super().default_get(fields_list)# 然后再执行自己的逻辑去对defaults 进行修改,最后再将它返回。if 'journal_id' in defaults and 'date' in fields_list:last_line = self.search([('journal_id', '=', defaults.get('journal_id')),('state', '=', 'posted'),], limit=1)statement = last_line.statement_idif statement:defaults.setdefault('date', statement.date)elif last_line:defaults.setdefault('date', last_line.date)return defaults

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

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

相关文章

[Hive] Map类型在表中是如何存储的

在 Hive 中&#xff0c;Map 类型是指键值对的集合&#xff0c;其中键和值都可以是任意数据类型。 在 Hive 表中&#xff0c;Map 类型通常被存储为结构体或者键值对列表。 具体来说&#xff0c;在表中&#xff0c;Map 类型通常分为以下两种存储方式&#xff1a; 文章目录 结构…

PCTA认证考试-01_TiDB数据库架构概述

TiDB 数据库架构概述 一、学习目标 理解 TiDB 数据库整体结构。了解 TiDB Server&#xff0c;TiKV&#xff0c;TiFlash 和 PD 的主要功能。 二、TiDB 体系架构 1. TiDB Server 2. TiKV OLTP 3. Placement Driver 4. TiFlash OLAP OLTPOLAPHTAP

思考的起点(一): 事实与判断

事实与判断是思考的主要组成部分&#xff0c;深入理解事实与判断的基本概念&#xff0c;了解其应用可以提升个体的思考质量; 关于事实真相 事实是认知的基础 1.很多事情没有真相, 或者说真相陷入历史的迷雾中, 无法被发现; 2.世界不需要真相&#xff0c;真相往往都是复杂又残…

Go并发编程

一、goroutine 和 通道 在Go语言中&#xff0c;每一个并发执行的活动成为goroutine。通道则是每一个goroutine之间传递消息的工具。 1、Goroutine 在一个Go程序中&#xff0c;只有一个主Goroutine来调用main函数。生成新的goroutine也十分简单&#xff0c;例如有一个函数&…

GZ035 5G组网与运维赛题第9套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第9套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

springboot actuator jvm监控丢失

1、背景 系统接入了监控prometheus和grafana&#xff0c;某天grafana突然发现只有几台机器可以看到指标。 随便点击一个地址http://192.168.0.76:8681/lms/actuator/prometheus访问指标&#xff0c;发现JVM相关指标全部丢失 2、解决方法 从网上查找相关资料&#xff0c;逐一…

【实践篇】一次Paas化热部署实践分享 | 京东云技术团队

前言 本文是早些年&#xff0c;Paas化刚刚提出不久时&#xff0c;基于部门内第一次Paas化热部署落地经验所写&#xff0c;主要内容是如何构建一些热部署代码以及一些避雷经验。 一、设计-领域模型设计 1.首先&#xff0c;确定领域服务所属的领域 2.其次&#xff0c;确定垂直…

leetcode经典面试150题---6.旋转数组

题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数 示例 1&#xff1a; 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步…

2024上海国际合成生物学与绿色生物制造展览会8月7-9号上海举办

2024年8月7日至9日&#xff0c;一场生物制造领域的盛会将在上海新国际博览中心闪亮登场。那就是2024上海国际合成生物学与绿色生物制造展览会。这场盛会将同期举办2024第13届上海国际生物发酵展&#xff0c;形成了一个强大的“生物军团”&#xff0c;展现出生物科技领域的无限魅…

图解系列--理解L3交换机的性能与功能

04.01 何为 L3 交换机 L3交换机是一种在L2 交换机的基础上增加了路由选择功能的网络硬件&#xff0c;能够通过基于ASIC 和 FPGA 的硬件处理高速实现网络功能和转发分组。L2 是指 OSI 参考模型中的L2, 也就是数据链路层。L2 交换机能够基于该层主要编址的 MAC 地址&#xff0c;…

深度学习框架TensorFlow.NET环境搭建1(C#)

测试环境 visual studio 2017 window10 64位 测试步骤如下&#xff1a; 1 新建.net framework控制台项目&#xff0c;工程名称为TensorFlowNetDemo&#xff0c;.net framework的版本选4.7.2&#xff0c;如下图&#xff1a; 2 分别安装TensorFlow.NET包(先装)和SciSharp.…

力扣每日一题100:相同的树

题目描述&#xff1a; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&…

计算机毕设 基于大数据的抖音短视频数据分析与可视化 - python 大数据 可视化

文章目录 0 前言1 课题背景2 数据清洗3 数据可视化地区-用户观看时间分界线每周观看观看路径发布地点视频时长整体点赞、完播 4 进阶分析相关性分析留存率 5 深度分析客户价值判断 5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;…

ThreadLocal用法

ThreadLocal 用法 ThreadLocal从字面意思来说&#xff0c;独立线程空间的意思&#xff0c;所以其用法也很简单&#xff0c;就是当一个线程需要有自己的变量&#xff0c;并且这个变量不想和其他变量共享&#xff0c;那么就使用ThreadLocal 变量&#xff1a; 比如常见的我们经常…

解决一个Qt程序崩溃的问题

当Qt崩溃时&#xff0c;使用Qt Creator调试&#xff0c;也无法定位到是哪个地方除了问题。只发现日志报出一个Fatal。 Fatal: 2023-11-05 00:16:26 [io\qprocess_win.cpp:826] ASSERT: "pid" in file io\qprocess_win.cpp, line 826触发的情况&#xff0c;就是使用…

VR全景技术在文化展示与传播中有哪些应用?

引言&#xff1a; 随着科技的不断进步&#xff0c;虚拟现实&#xff08;VR&#xff09;全景技术已经成为文化展示与传播领域的一项重要工具。那么VR全景技术是如何改变文化展示与传播方式&#xff0c;VR全景技术又如何推动文化的传承和普及呢&#xff1f; 一&#xff0e;VR技术…

壹[1],Opencv常用结构

1&#xff0c;Point类&#xff1a;点表示 point表示二维结构的点,(x,y) cv::Point point; point.x 100; point.y 100; 2&#xff0c;Scalar类&#xff1a;颜色表示 cv::Scalar colorBlue(255,0,0);//蓝色 cv::Scalar colorGreen(0, 255, 0);//绿色 cv::Scalar colorRed(0, …

第11章_数据处理之增删改

文章目录 1 插入数据1.1 实际问题1.2 方式 1&#xff1a;VALUES的方式添加1.3 方式2&#xff1a;将查询结果插入到表中演示代码 2 更新数据演示代码 3 删除数据演示代码 4 MySQL8新特性&#xff1a;计算列演示代码 5 综合案例课后练习 1 插入数据 1.1 实际问题 解决方式&#…

英语语音识别,语言评测,语音打分实践与代码实现

项目在这&#xff1a;couldn/speech-evaluation-of-english 详细的可查看项目内的md文档

是时候放弃 Java 序列化了

基本概念 Java 序列化和反序列化三连问&#xff1a; 什么是 Java 序列化和反序列化&#xff1f;为什么需要 Java 序列化和反序列化&#xff1f;如何实现 Java 序列化和反序列化&#xff1f; 是什么 一句话就能够说明白什么是 Java 序列化和反序列化&#xff1f;Java 序列化…