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

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

Odoo 中文社区

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

[已解决]float值写入不了

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

    qty字段怎么定义的

    H 1 条回复 最后回复
    0
    • H hui

      两个主要的代码,在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)
      
      D 离线
      D 离线
      digitalsatori
      管理员
      发表于 最后由 编辑
      #3

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

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

      H 1 条回复 最后回复
      0
      • S 离线
        S 离线
        Siyuan
        发表于 最后由 编辑
        #4

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

        实在不行,

        大不了sql 语句直接 insert into,

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

        H 1 条回复 最后回复
        0
        • W wangyuhui

          qty字段怎么定义的

          H 离线
          H 离线
          hui
          发表于 最后由 编辑
          #5

          @wangyuhui 这样定义的。

          qty = fields.Float('Qty', default=0, digits=(10, 2))
          
          1 条回复 最后回复
          0
          • S Siyuan

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

            实在不行,

            大不了sql 语句直接 insert into,

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

            H 离线
            H 离线
            hui
            发表于 最后由 编辑
            #6

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

            qty = fields.Float('Qty', default=0, digits=(10, 2))
            
            1 条回复 最后回复
            0
            • D digitalsatori

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

              H 离线
              H 离线
              hui
              发表于 最后由 编辑
              #7

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

              这边代码没有问题。

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

              H D 2 条回复 最后回复
              0
              • H hui

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

                这边代码没有问题。

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

                H 离线
                H 离线
                hui
                发表于 最后由 编辑
                #8

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

                1 条回复 最后回复
                0
                • H hui

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

                  这边代码没有问题。

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

                  D 离线
                  D 离线
                  digitalsatori
                  管理员
                  发表于 最后由 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
                  • D digitalsatori

                    @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!")
                    H 离线
                    H 离线
                    hui
                    发表于 最后由 编辑
                    #10

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

                    自定义对象也会被isinstance排除

                    这句什么意思?

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

                    D 1 条回复 最后回复
                    0
                    • H hui

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

                      自定义对象也会被isinstance排除

                      这句什么意思?

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

                      D 离线
                      D 离线
                      digitalsatori
                      管理员
                      发表于 最后由 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
                      • D digitalsatori

                        @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是不可以的,必须要进行显示的类型转换

                        H 离线
                        H 离线
                        hui
                        发表于 最后由 hui 编辑
                        #12

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

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

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

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

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

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

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

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

                            H 1 条回复 最后回复
                            0
                            • D digitalsatori

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

                              H 离线
                              H 离线
                              hui
                              发表于 最后由 编辑
                              #15

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

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

                              D 1 条回复 最后回复
                              0
                              • H hui

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

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

                                D 离线
                                D 离线
                                digitalsatori
                                管理员
                                发表于 最后由 编辑
                                #16

                                @hui

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

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

                                1 条回复 最后回复
                                0

                                你好!看起来您对这段对话很感兴趣,但您还没有一个账号。

                                厌倦了每次访问都刷到同样的帖子?您注册账号后,您每次返回时都能精准定位到您上次浏览的位置,并可选择接收新回复通知(通过邮件或推送通知)。您还能收藏书签、为帖子顶,向社区成员表达您的欣赏。

                                有了你的建议,这篇帖子会更精彩哦 💗

                                注册 登录
                                回复
                                • 在新帖中回复
                                登录后回复
                                • 从旧到新
                                • 从新到旧
                                • 最多赞同


                                • 登录

                                • 没有帐号? 注册

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