跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. [已解决]float值写入不了

[已解决]float值写入不了

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
16 帖子 4 发布者 3.2k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • H 离线
    H 离线
    hui
    在 回复了 wangyuhui 最后由 编辑
    #5

    @wangyuhui 这样定义的。

    qty = fields.Float('Qty', default=0, digits=(10, 2))
    
    1 条回复 最后回复
    0
    • H 离线
      H 离线
      hui
      在 回复了 Siyuan 最后由 编辑
      #6

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

      qty = fields.Float('Qty', default=0, digits=(10, 2))
      
      1 条回复 最后回复
      0
      • H 离线
        H 离线
        hui
        在 回复了 digitalsatori 最后由 编辑
        #7

        @digitalsatori 在 float值写入不了 中说:

        这边代码没有问题。

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

        H digitalsatoriD 2 条回复 最后回复
        0
        • H 离线
          H 离线
          hui
          在 回复了 hui 最后由 编辑
          #8

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

          1 条回复 最后回复
          0
          • digitalsatoriD 离线
            digitalsatoriD 离线
            digitalsatori 管理员
            在 回复了 hui 最后由 digitalsatori 编辑
            #9

            @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!")

            【上海先安科技】(tony AT openerp.cn)

            H 1 条回复 最后回复
            0
            • H 离线
              H 离线
              hui
              在 回复了 digitalsatori 最后由 编辑
              #10

              @digitalsatori 在 float值写入不了 中说:

              自定义对象也会被isinstance排除

              这句什么意思?

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

              digitalsatoriD 1 条回复 最后回复
              0
              • digitalsatoriD 离线
                digitalsatoriD 离线
                digitalsatori 管理员
                在 回复了 hui 最后由 digitalsatori 编辑
                #11

                @hui 在 float值写入不了 中说:

                @digitalsatori 在 float值写入不了 中说:

                自定义对象也会被isinstance排除

                这句什么意思?

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

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

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

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

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

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

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

                【上海先安科技】(tony AT openerp.cn)

                H 1 条回复 最后回复
                0
                • H 离线
                  H 离线
                  hui
                  在 回复了 digitalsatori 最后由 hui 编辑
                  #12

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

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

                  1 条回复 最后回复
                  0
                  • digitalsatoriD 离线
                    digitalsatoriD 离线
                    digitalsatori 管理员
                    写于 最后由 编辑
                    #13

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

                    【上海先安科技】(tony AT openerp.cn)

                    1 条回复 最后回复
                    0
                    • digitalsatoriD 离线
                      digitalsatoriD 离线
                      digitalsatori 管理员
                      写于 最后由 编辑
                      #14

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

                      【上海先安科技】(tony AT openerp.cn)

                      H 1 条回复 最后回复
                      0
                      • H 离线
                        H 离线
                        hui
                        在 回复了 digitalsatori 最后由 编辑
                        #15

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

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

                        digitalsatoriD 1 条回复 最后回复
                        0
                        • digitalsatoriD 离线
                          digitalsatoriD 离线
                          digitalsatori 管理员
                          在 回复了 hui 最后由 编辑
                          #16

                          @hui

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

                          【上海先安科技】(tony AT openerp.cn)

                          1 条回复 最后回复
                          0

                          • 登录

                          • 没有帐号? 注册

                          • 登录或注册以进行搜索。
                          • 第一个帖子
                            最后一个帖子
                          0
                          • 版块
                          • 标签
                          • 热门
                          • 用户
                          • 群组