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

Django ORM和SQLite中的数学:如果是整数,则忽略十进制,如果不是整数,则更正结果

  •  0
  • Saturnix  · 技术社区  · 4 年前

    在一个复杂的查询中,我有这样一个注释:

    result.annotate(test=ExpressionWrapper(485.00 / F( 'period_duration' ), 
    output_field=DecimalField()))
    

    这给了我正确的结果:

    Decimal('8.01917989417989E-10')
    

    然而,如果我替换 485.00 具有 485 :

    result.annotate(test=ExpressionWrapper( 485 / F( 'period_duration' ),
    output_field=DecimalField()))
    

    我得到:

    Decimal('0')
    

    如果不是485也来自一个叫做 value “.我的问题如下:

    result.annotate(test=ExpressionWrapper( F( 'value' ) / F( 'period_duration' ),
    output_field=DecimalField()))
    

    价值观是一种价值观 MoneyField 基本上只是一个围绕着德米尔菲尔德的花式包装。

    我可以强迫我的用户总是使用正确的小数( 485 而不是 485 ),这本身就是一个糟糕的设计,但是。。。即使如此,如果数据库值为 485 ,Django的行为就好像 485 于是又回来了 0 在做浮点数学的时候。

    我试过了 Cast 将价值传递给 DecimalField ,没有用。

    result.annotate( res=ExpressionWrapper(
    Cast('value', output_field=DecimalField()) / F( 'period_duration' ),
    output_field=DecimalField() )).last().res
    

    结果总是:

    十进制('0')
    

    而不是正确的:

    十进制('8.01917989417989E-10')
    

    我怎样才能强迫Django始终使用浮点数学?

    附笔 period_duration 604800000000 ,如果有帮助的话。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Dave Austin    4 年前

    你确定吗? F( 'value' ) 给你一个号码吗?

    MoneyField存储你的属性 价值 两列,所以 F(‘值’) 可能不是你所期望的。

    也许试试 F( 'value_amount' ) .