草庐IT

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

coder 2023-10-03 原文

在注释中我做了一些计算,我希望输出为小数,最多 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/

有关mysql - Django 注释 output_field=DecimalField 忽略 max_digits 和 decimal_places的更多相关文章

  1. ruby-on-rails - 更好的替代方法 try( :output). try( :data). try( :name)? - 2

    “输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  2. ruby - 从 Ruby : capturing the output while displaying the output? 运行 shell 命令 - 2

    我有一个问题。我想从另一个ruby​​脚本运行一个ruby​​脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密

  3. ruby-on-rails - 每当 gem : I set :output but the logfile doesn't show up where I'd expect it to - 2

    在我的schedule.rb文件中,我有以下几行:set:output,'/log/cron_log.log'every5.minutesdocommand'echo"hello"'end我按照这个问题Rails,usingwhenevergemindevelopment中的建议运行了whenever-w,并且我假设cronfile已编写并正在运行。(我也尝试重新启动Rails服务器。)当我运行$crontab-l时,我看到以下内容:0,5,10,15,20,25,30,35,40,45,50,55****/bin/bash-l-c'echo"hello">>/log/cron_log

  4. ruby-on-rails - 奇数 rake db :migrate output - 2

    为什么rakedb:migrate运行Executedb:schema:dump我的输出全都搞砸了(显示SQL)。看起来像这样:ActiveRecord::SchemaMigrationLoad(0.5ms)SELECT"schema_migrations".*FROM"schema_migrations"(3.7ms)SELECTt2.oid::regclass::textASto_table,a1.attnameAScolumn,a2.attnameASprimary_key,c.connameASname,c.confupdtypeASon_update,c.confdeltyp

  5. ruby-on-rails - 在 Ruby on Rails 中验证 Django 密码给出不匹配的密码 - 2

    我正在用RubyonRails重写Django应用程序,并希望为用户保留旧密码。Django使用PBKDF2SHA1作为加密机制。所以我有一个加密密码是这个pbkdf2_sha256$10000$YsnGfP4rZ1IZ$Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBPUgmunFOW4=原密码是2bulls在Ruby中,我使用PBKDF256gem和base64进行检查。Base64.encode64PBKDF256.dk("2bulls","YsnGfP4rZ1IZ",10000,32)我很期待Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBP

  6. Ruby minitest assert_output 语法 - 2

    我是minitest的新手,也是ruby​​的新手,我真的厌倦了用谷歌搜索这个问题却没有结果。非常感谢您的帮助:rubyminitest中assert_output的确切语法是什么?我在github或其他地方找到的所有内容似乎都使用括号。然而,当我不使用带有assert_output的block时,我收到一条错误消息,这是有道理的,因为此方法的定义包含yield语句。但无论我怎样尝试,我都无法让它发挥作用。测试类.rbclassTestClassdefoutputputs'hey'endend测试测试.rbrequire'minitest/spec'require'minitest/a

  7. 基于python的短视频智能推荐/django的影视网站/视频推荐系统 - 2

    摘要本论文主要论述了如何使用Python技术开发一个短视频智能推荐,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述短视频智能推荐的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 短视频智能推荐的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、热门视频管理、用户上传管理、系统管理,用户:首页、个人中心、用户上传管理、我的收藏管理,前台首页;首页、热门视频、用户上传、公告信息、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个短视频智能推荐信

  8. ruby - Sinatra Web 管理员(如 Django 管理员) - 2

    有没有办法为Sinatra获取DjangoAdmin风格的网络管理员? 最佳答案 没用过,但通过谷歌很快就显示出来了:http://www.padrinorb.com/ 关于ruby-SinatraWeb管理员(如Django管理员),我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2855494/

  9. ruby - 表示 "at least one non-digit"的正则表达式 - 2

    我想根据这个模式验证用户名:允许的字符:字母、数字、连字符、下划线第一个字符必须是字母或数字用户名不能全是数字这个正则表达式满足上面的1和2,但是我想不通如何满足3:/^[a-zA-Z\d][\w\-]+$/(我正在使用Ruby,如果相关的话) 最佳答案 不是很高效,但是很简单:/^(?!\d+$)[a-zA-Z\d][\w\-]+$/前瞻只是意味着:“后面不是一串数字,一直持续到最后”。 关于ruby-表示"atleastonenon-digit"的正则表达式,我们在StackOver

  10. ruby-on-rails - 显示复选框 best_in_place ruby​​ gem - 2

    我在项目中使用best_in_placegem,我试图在它自己的位置显示一个复选框,但我做不到。我正在搜索它,但我无法在任何地方找到答案。我发现人们在谈论显示“否”或"is"……或其他任何内容。但我只想查看复选框是否选中。 最佳答案 我使用的是font-awesome,但您也可以将它与Bootstrap或其他图像一起使用。我显示复选框的解决方案只是使用rawmethod呈现复选框图像(在我的例子中是font-awesome图标之一)=best_in_place@project,:active,:type=>:checkbox,:co

随机推荐