跟我学Xodoo第四天

计算

到目前为止,字段已直接存储在数据库或直接从数据库中检索。字段也可以被计算。如果字段用compute的计算方法,不会从数据库中检索字段的值,而是通过调用模型的方法计算出值

为了计算字段,请创建一个字段并为其添加compute属性(去承载计算结果),比如:

import random
from Xodoo import models, fields, api
class ComputedModel(models.Model):
    _name = 'test.computed'
    name = fields.Char(compute='_compute_name')#添加compute属性

    def _compute_name(self):#计算方法
        for record in self:#遍历self
            record.name = str(random.randint(1, 1e6))

注意!

self是一个记录集合。

它支持Python中对于集合的操作,例如:len(self) 和 iter(self) 以及recs1 + recs2

遍历self会得到一条一条的记录,每个记录本身就是一个大小为1的集合。你可以使用.来访问/分配单个记录上的字段,如record.name

依赖

计算字段的值通常依赖其他字段的值。ORM期望开发人员使用装饰器指定对计算方法的依赖depends()当依赖项被修改时,ORM会使用新给给定的依赖项重新计算:

from Xodoo import models, fields, api
class ComputedModel(models.Model):
    _name = 'test.computed'
    name = fields.Char(compute='_compute_name')#添加compute属性
    value = fields.Integer()#定义依赖的字段
    @api.depends('value')#依赖'value'字段的值
        def _compute_name(self):#计算方法
            for record in self:
                record.name = "Record with value %s" % record.value

默认值

任何字段都可以设定一个默认值。在定义字段时,添加default=X属性,其中X是Python文字值(布尔值,整数,浮点数,字符串),或者是带有记录集并返回值的函数:

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

self.env可以访问请求参数和其他东西:(非常常用!)

  • self.env.cr或者self._cr 是数据库cursor对象;或者它被用于查询数据库
  • self.env.uid或者self._uid是当前用户的数据库ID
  • self.env.user是当前用户的记录
  • self.env.context或者self._context是上下文字典
  • self.env.ref(xml_id)返回与XML id对应的记录

onchange

“onchange”机制为客户端界面提供了一种方法,只要用户在字段中填写了值,便无需用户将任何内容保存到数据库就可以更新表单。

例如:假设一个模型有三个字段amountunit_price price,并且你想在修改任何其他字段时更新表单上的价格。为此,请定义一个方法,该方法在self表单视图中表示记录,并用其修饰onchange()以指定必须在哪个字段上触发记录。你所做的任何更改self都会反映在表格上。

<!-- content of form view -->
<field name="amount"/>
<field name="unit_price"/>
<field name="price" readonly="1"/>@api.onchange('amount', 'unit_price')#我们称为修饰器
def _onchange_price(self):
    # 设置自动计算的字段,并且上面view里设置为只读
    self.price = self.amount * self.unit_price
    # 可以选择返回警告和域
        return {
        'warning': {
            'title': "Something bad happened",
            'message': "It was very bad indeed",
        }
    }

*对于计算字段来说,onchange是内置的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DTCloud4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值