代码之家  ›  专栏  ›  技术社区  ›  Dhouha

如何解决“TypeError:float()参数必须是字符串或数字”

  •  1
  • Dhouha  · 技术社区  · 6 年前

    我正在尝试安装模块 product_print_zpl_barcode 在奥多9。 此模块用于添加产品变体向导,以在ZPL打印机上生成和打印产品条形码。 我得到了错误:

    TypeError:float()参数必须是字符串或数字

    当我按下“打印条形码”按钮时。

    以下是源代码和错误:

    product\u print\u zpl\u条形码。py公司

     # -*- coding: utf-8 -*-
    
     from openerp import models, fields, api, _
     from openerp.exceptions import UserError
     from openerp.tools import float_compare, float_is_zero
     import openerp.addons.decimal_precision as dp
     import base64
     import re
    
    
     class ProductPrintZplBarcode(models.Model):
    _name = 'product.print.zpl.barcode'
    _description = 'Generate and print product barcodes in ZPL'
    
    @api.depends('pricelist_id', 'quantity', 'product_id')
    def _compute_price(self):
        # for regular barcodes
        for wiz in self:
            if wiz.pricelist_id and wiz.product_id:
                price_uom = wiz.pricelist_id.price_get(wiz.product_id.id, 1)
                wiz.price_uom = price_uom
                wiz.price = price_uom * wiz.quantity
        return wiz.price
    

    回溯

       Traceback (most recent call last):
     File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 650, in _handle_exception
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 687, in dispatch
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 323, in _call_function
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\service\model.py", line 118, in wrapper
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 316, in checked_call
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 966, in __call__
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\http.py", line 516, in response_wrap
    File "D:\Projet_Odoo\Odoo 9.20180426\server\openerp\addons\web\controllers\main.py", line 896, in call_kw
    File "D:\Projet_Odoo\Odoo 9.20180426\server\openerp\addons\web\controllers\main.py", line 888, in _call_kw
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\api.py", line 250, in wrapper
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\api.py", line 381, in old_api
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\models.py", line 6067, in onchange
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\models.py", line 5770, in __getitem__
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 834, in __get__
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 949, in determine_draft_value
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 895, in compute_value
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 885, in _compute_value
    File "D:\Projet_Odoo\Odoo 9.020180426\server\openerp\addons\product_print_zpl_barcode\models\product_print_zpl_barcode.py", line 100, in _compute_price
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 847, in __set__
    File "D:\Projet_Odoo\Odoo 9.0-20180426\server\.\openerp\fields.py", line 1177, in convert_to_cache
    TypeError: float() argument must be a string or a number
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Kenly    6 年前

    不要返回任何值。

    如Odoo网站所述 You should assign the computed value to the field :

    计算字段

    可以使用compute参数计算字段(而不是直接从数据库读取)。它必须将计算值分配给字段。如果它使用其他字段的值,则应使用depends()指定这些字段

    评估后 price_uom = wiz.pricelist_id.price_get(wiz.product_id.id, 1) :

    price_uom 将是一份口述( {pricelist_id: price} )因此,在尝试执行任何算术运算之前,您需要获取price\u uom。

    @api.depends('pricelist_id', 'quantity', 'product_id')
    def _compute_price(self):
        # for regular barcodes
        for wiz in self:
            if wiz.pricelist_id and wiz.product_id:
                # You need to get price from the dict using pricelist_id
                price_uom = wiz.pricelist_id.price_get(wiz.product_id.id, 1)[wiz.pricelist_id.id]
                wiz.price_uom = price_uom
                wiz.price = price_uom * wiz.quantity
        return wiz.price
    

    您可以看到 price_get 如果您查看以下代码(我刚刚复制了所需的最小代码),就会计算返回值:

    def price_get(self, cr, uid, ids, prod_id, qty, partner=None, context=None):
        return dict((key, price[0]) for key, price in self.price_rule_get(cr, uid, ids, prod_id, qty, partner=partner, context=context).items())
    
    def price_rule_get(self, cr, uid, ids, prod_id, qty, partner=None, context=None):
        product = self.pool.get('product.product').browse(cr, uid, prod_id, context=context)
        res_multi = self.price_rule_get_multi(cr, uid, ids, products_by_qty_by_partner=[(product, qty, partner)], context=context)
        res = res_multi[prod_id]
        return res
    
    def price_rule_get_multi(self, cr, uid, ids, products_by_qty_by_partner, context=None):
        """multi products 'price_get'.
            @param ids:
            @param products_by_qty:
            @param partner:
            @param context: {
                'date': Date of the pricelist (%Y-%m-%d),}
            @return: a dict of dict with product_id as key and a dict 'price by pricelist' as value
        """
        if not ids:
            ids = self.pool.get('product.pricelist').search(cr, uid, [], context=context)
        results = {}
        for pricelist in self.browse(cr, uid, ids, context=context):
            subres = self._price_rule_get_multi(cr, uid, pricelist, products_by_qty_by_partner, context=context)
            for product_id, price in subres.items():
                results.setdefault(product_id, {})
                results[product_id][pricelist.id] = price
        return results