- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在注释中我做了一些计算,我希望输出为小数,最多 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/
我已经在 models.py 中声明了以下字段。 marks = models.DecimalField(max_digits=2, decimal_places=2, default=3.0) 后端
我有一个模型字段full_time_equivalent: full_time_equivalent = models.DecimalField( max_digits=5, deci
我在模型上定义了一个 DecimalField,其 decimal_places 属性等于 max_digits 属性(用于存储 < 1 的值),如下所示: class MyModel(Model):
在注释中我做了一些计算,我希望输出为小数,最多 8 位数字和最多 2 位小数。我不知道为什么 Django 会忽略 decimal_places 和 max_digits。这是我的代码: Order.
我是一名优秀的程序员,十分优秀!