gpt4 book ai didi

mysql - Django 注释 output_field=DecimalField 忽略 max_digits 和 decimal_places

转载 作者:可可西里 更新时间:2023-11-01 06:48:28 26 4
gpt4 key购买 nike

在注释中我做了一些计算,我希望输出为小数,最多 8 位数字和最多 2 位小数。我不知道为什么 Django 会忽略 decimal_places 和 max_digits。这是我的代码:

Order.objects.all().annotate(
amount=Coalesce(
Sum(
Case(
When(
Q(payments__status='complete'),
then=F('payments__amount') - (
F('payments__amount') * F('payments__vat')/100
)
), output_field=DecimalField(decimal_places=2, max_digits=8)

)
), 0)
).values('amount')

输出 = 12.5999999999999996447286321199499070644378662109375我正在使用 Django 1.9.5

最佳答案

我在工作中遇到了同样的问题,为了解决这个问题,我创建了以下自定义聚合:

class SumDecimal(Func):
function = 'SUM'
name = 'sum'
contains_aggregate = True
output_field = DecimalField()
template = '%(function)s(%(expressions)s)'

def __init__(self, *args, **kwargs):
self.decimal_places = kwargs.pop('decimal_places', None)
super(SumDecimal, self).__init__(*args, **kwargs)

def as_sql(self, compiler, connection, function=None, template=None):
sql = super(SumDecimal, self).as_sql(
compiler=compiler,
connection=connection,
function=function,
template=template)

if self.decimal_places:
sql, params = sql
sql = 'CAST(%s AS DECIMAL(16, %d))' % (sql, self.decimal_places)
return sql, params

return sql

要使用它非常简单,只需像这样使用:

mymodel.objects.all().annotate(sum_value=SumDecimal('value', decimal_places=2))

关于mysql - Django 注释 output_field=DecimalField 忽略 max_digits 和 decimal_places,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42248733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com