Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn

由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

[已解决]float值写入不了



  • 两个主要的代码,在val的时候获取都是正确的,但是create后,qty值没有写入,找不到原因啊。

    qty = 0 if -1 == qty_index else row_data[qty_index]
                        if isinstance(qty, (int, float)):
                            qty = float(qty)
    
    val = {
                                "template_id": template_id,
                                "part_number": part_number_id,
                                "description": desc,
                                "qty": qty,
                                "unit": unit_id,
                                "demand": demand,
                                "supplier_id": supplier_id,
                                "remarks": remarks,
                                'bom_qty': bom_qty,
                                'delivery_status': delivery_status,
                                'page': page,
                            }
                            self.env['upi.template.line'].create(val)
    


  • qty字段怎么定义的


  • 管理员

    @hui 除了贴代码需要保持格式以外,这边代码没有问题。



  • qty 是个readonly, 不保存到数据库的计算字段?

    实在不行,

    大不了sql 语句直接 insert into,

    前提是你要对表的结构很熟悉



  • @wangyuhui 这样定义的。

    qty = fields.Float('Qty', default=0, digits=(10, 2))
    


  • @siyuan 都不是,就是普通的定义如下。

    qty = fields.Float('Qty', default=0, digits=(10, 2))
    


  • @digitalsatorifloat值写入不了 中说:

    这边代码没有问题。

    那我应该从哪里排除问题呢



  • @hui 或者说,不是值的问题,是这个字段qty的问题,只有写入这个字段写入不了,如果把qty的值写入其他float字段的话,值可以写入的。


  • 管理员

    @hui
    你贴出来的代码实在有限而且格式混乱,很难猜测。

    1. 大致思路,先看一下qty字段在数据库里是否正常创建了
    2. isinstance判断并不好,因为如果你运行的是python2.x,那么整数还有一个长整数类型long, 另外可以被转换为浮点类型的字符串和自定义对象也会被isinstance排除。python中应该尽量使用duck typing的概念,即:“只要它叫的像个鸭,走得像个鸭,我们就当它个鸭子,不必解剖判断它是不是个鸭子类型”

    所以上面的isinstance的写法,可以改成:

    try:
       qty = float(qty)
    except ValueError:
       log("Can't convert to float, value type is incorrect!")


  • @digitalsatorifloat值写入不了 中说:

    自定义对象也会被isinstance排除

    这句什么意思?

    还有因为python算弱类型语言,我不能给默认值的。


  • 管理员

    @huifloat值写入不了 中说:

    @digitalsatorifloat值写入不了 中说:

    自定义对象也会被isinstance排除

    这句什么意思?

    当然与你现在的问题不一定相关,但是比如我自定义了一个类: ExtendedInt用来扩展python的基础类int, 这个类具有所有int的功能和特征,也可以转换为float类型:

    class ExtendedInt:
        pass
    
    a = ExtendedInt(8)
    float(a)       ---> 8.0
    isinstance(a, int)   ----> False
    

    所以用isinstance去判断类型,然后做类型转换的话, 这个a对象就被排除在类型转换之外了。

    还有因为python算弱类型语言,我不能给默认值的。

    错了。
    Python是动态类型语言,同时也是强类型语言
    比如像js这样的弱类型语言可以这样来搞

    'x' + 100 ---> 'x100'
    

    python是不可以的,必须要进行显示的类型转换



  • @digitalsatori
    Python是动态类型语言,同时也是强类型语言

    我的意思是比如qty是float类型的,我不能默认给个qty=0(这个是在插入数据库数据的时候,qty的值可以是‘’),后续可能获取到一个空字符串,就把0给顶掉了。


  • 管理员

    你现在的具体问题是什么?是不管qty设了什么值,创建记录后qty都是0吗?


  • 管理员

    你能确定你的row_data列表里的数据是intfloat两种吗?
    你有试过不做isinstance判断,直接用try ... except ...吗?



  • @digitalsatori
    我原先认为我的row_data的数据是intfloat两种,实际上还有str类型的,所以我的错误找到了,是出现如果是str类型的,我都给写成qty=0了。

    试过不做isinstance判断,直接用try...except...的话,如果qty=‘’的话就会触发异常的,需要给这个排除才可以的。暂时就想到这些。


  • 管理员

    @hui

    使用try ... except 的好处就是让你能处理类似可转换为float的字符串'100', 象空字符' '或其他不能转换为float的字符正好在except中处理。


Log in to reply