当前位置: 首页 > news >正文

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

相关文章:

  • 06_es分布式搜索引擎2
  • 【广州华锐互动】VR历史古城复原:沉浸式体验古代建筑,感受千年风华!
  • 动态规划笔记+经典习题十道
  • CentOS7安装Docker及添加阿里云镜像加速详细教程
  • JS条件表达式
  • Java程序设计2023-第四次上机练习
  • WPF布局控件之WrapPanel布局
  • 【多线程】线程的创建
  • 『CV学习笔记』图像超分辨率等图像处理任务中的评价指标PSNR(峰值信噪比)
  • 【AutoML】AutoKeras 的安装和环境配置(VSCode)
  • PHP foreach 循环跳过本次循环
  • 队列实现(基于内存池思想)
  • 指针那些事
  • 第7章-使用统计方法进行变量有效性测试-7.1-假设检验
  • C语言,数据结构指针,结构构体操作符 •,->,*的区别,看这篇就够了
  • [译] 怎样写一个基础的编译器
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • DataBase in Android
  • Docker 笔记(2):Dockerfile
  • ES6--对象的扩展
  • Laravel Mix运行时关于es2015报错解决方案
  • LeetCode29.两数相除 JavaScript
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Python学习之路16-使用API
  • Service Worker
  • spring cloud gateway 源码解析(4)跨域问题处理
  • SQL 难点解决:记录的引用
  • tensorflow学习笔记3——MNIST应用篇
  • Vue2.0 实现互斥
  • XForms - 更强大的Form
  • 经典排序算法及其 Java 实现
  • 来,膜拜下android roadmap,强大的执行力
  • 每天10道Java面试题,跟我走,offer有!
  • 正则学习笔记
  • scrapy中间件源码分析及常用中间件大全
  • 选择阿里云数据库HBase版十大理由
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #pragma data_seg 共享数据区(转)
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (4)logging(日志模块)
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Java数据结构)ArrayList
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)JAVA中的堆栈
  • (转)shell调试方法
  • **CI中自动类加载的用法总结
  • .aanva
  • .net framework 4.0中如何 输出 form 的name属性。