openerp中的功能字段 - 将数量转换为字符串

时间:2013-07-14 05:40:37

标签: python openerp

我想知道如何在opnerp7中将金额转换为等值金额字符串。 我定义了一个功能字段来实现这个但是它在我的DataBase中创建了一个字段而不是数据,任何人都可以指出我错在哪里,我可以在这里发布我的示例源

查看:

<field name="amount_words"/>

python代码

返回转换金额的函数 -

def _amount_in_words(self, cr, uid, ids, field_name, arg, context=None):

    cur_obj = self.pool.get('res.currency')
    res = {}
    for order in self.browse(cr, uid, ids, context=context):
        taxed = untaxed = 0.0
        res[order.id] = {
            'amount_words': '0.0',
                        }
        val = val1 = 0.0
        cur = order.pricelist_id.currency_id
        for line in order.order_line:
            val1 += line.price_subtotal
            val += self._amount_line_tax(cr, uid, line, context=context)

        taxed = cur_obj.round(cr, uid, cur, val)
        untaxed = cur_obj.round(cr, uid, cur, val1)

        res[order.id]['amount_words'] = amount_to_text(float(taxed + untaxed))

    return res[order.id]['amount_words']

功能字段声明

'amount_words': fields.function(_amount_in_words, string='In Words', type="char", store=True, help="The amount in words"),

注意: - 'amount_to_text'是我的应用程序全局函数,它正是我想要的但是我无法将相同的数据传递到我的视图中???

'amount_to_text'返回如下数据,如果我通过amount_to_text(150)则返回 只有一百五十卢比

1 个答案:

答案 0 :(得分:0)

当您存储功能字段时,您需要提供触发器,以便ORM层知道何时应重新计算并存储您的字段。但是,这主要是针对这样一种情况,即您的功能字段取决于另一个模型的值,并且您希望通过不计算每次显示该值时的数量来加速OpenERP。

经典用例是发票。发票上的总额是行数的总和,因此为了加快速度,有一个触发的功能字段,这样每当发票行更改时,总计就会重新计算并存储在发票上。查看认证模块(OpenERP插件)中的account.invoice或sale.order模型。

在您的情况下,覆盖write方法更有意义并测试值字典中是否包含任何必填字段,如果是,则计算并以字为单位存储金额。

例如(从此处的记忆中提前道歉):

def write(self, cr, uid, ids, values, context = None):
    if 'quantity' in values or 'price_unit' in values:
        values['amount_in_words'] = _get_amount_in_words(....)

    return super(MyClass, self).write(cr, uid, ids, values, context = context)

但有几点:

  1. 您必须调整“if value in values”测试以包含 每个依赖领域。最好只删除它并做 它每一次。
  2. 也不要忘记覆盖create方法。
  3. 记住古老的格言“早期优化是万恶之源”。 你真的确定你需要用文字来表达这笔金额吗?