Django:在请求值时从查询集注释字段中删除小数前缀

     2023-02-23     107

关键词:

【中文标题】Django:在请求值时从查询集注释字段中删除小数前缀【英文标题】:Django: remove Decimal prefix from queryset annotated field, when requesting values 【发布时间】:2020-05-04 06:24:57 【问题描述】:

简而言之,我有这个查询集:

monthly_revenue = list(Booking.objects.annotate(month=Month('created_at'))
                           .values('month')
                           .annotate(total=Sum('price'))
                           .order_by('month'))

这是它返回的内容:

['month': 11, 'total': Decimal('4550.00')]

结果将转到 js 脚本以显示图形,我需要删除 Decimal() 前缀。 任何帮助或提示表示赞赏。

【问题讨论】:

【参考方案1】:

如果您只想删除“十进制”前缀,您可以在注释中定义一个特定的输出字段:

monthly_revenue = list(Booking.objects.annotate(month=Month('created_at'))
                           .values('month')
                           .annotate(total=Sum('price', output_field=FloatField()))
                           .order_by('month'))

【讨论】:

【参考方案2】:

由于您使用的是Django,因此您可以使用DjangoJSONEncoder,如下所示:

from django.core.serializers.json import DjangoJSONEncoder

my_dict = ['month': 11, 'total': Decimal('4550.00')]
json_result = json.dumps(my_dict, cls=DjangoJSONEncoder)

但是,请记住,DjangoJSONEncoder 会将十进制转换为字符串,因此结果将是:

["month": 11, "total": "4550.00"]

如果您导航到 DjangoJSONEncoder 源代码,您会发现:

elif isinstance(o, (decimal.Decimal, uuid.UUID, Promise)):
    return str(o)

【讨论】:

我已经为模型序列化扩展了该编码器,现在我只是将其调整为将十进制转换为浮点数,我将分享解决方案。【参考方案3】:

你可以把它转换成浮点型,像这样

monthly_revenue = list(Booking.objects.annotate(month=Month('created_at'))
                       .values('month')
                       .annotate(total=float(Sum('price')))
                       .order_by('month'))

【讨论】:

我早些时候尝试过,它不起作用它抛出:Traceback (most recent call last): File "<input>", line 3, in <module> TypeError: float() argument must be a string or a number, not 'Sum' 您可以在调用 Sum 函数之前将其转换为浮点数 不能在查询float() argument must be a string or a number, not 'F'中使用float【参考方案4】:

我终于找到了两个对我有用的解决方案: 感谢@Ramy 的回答,我覆盖了DjangoJSONEncoder,以支持将小数转换为浮点数:

import decimal
import uuid
from django.utils.functional import Promise
from django.core.serializers.json import DjangoJSONEncoder

class JsonDecimalToFloatEncoder(DjangoJSONEncoder):
def default(self, o):
    if isinstance(o, (decimal.Decimal, uuid.UUID, Promise)):
        return float(o)
    return super().default(o)

我按照他所说的那样使用它:

monthly_revenue = list(Booking.objects.annotate(month=Month('created_at'))
                               .values('month')
                               .annotate(total=Sum('price'))
                               .order_by('month'))
json_result = json.dumps(monthly_revenue,cls=ExtendedEncoder)
json_result
'["month": 11, "total": 4550.0]'

这个解决方案需要在服务器端做更多的工作,所以我选择了@rossi 的第二个解决方案,它在数据库而不是服务器上做更多的工作,这就是 django 的文档所建议的。

from django.db.models import FloatField
from django.db.models.functions import Cast

list(Booking.objects.annotate(month=Month('created_at'))
                              .values('month')                                
                              .annotate(total_as_f=Cast('total', 
                               output_field=FloatField()))
                              .order_by('month'))

['month': 11, 'total': Decimal('4550.00'), 'total_as_f': 4550.0]

希望这对未来的任何人都有帮助。

【讨论】:

与 django 查询集注释中的先前对象的区别

】与django查询集注释中的先前对象的区别【英文标题】:Differencewithpreviousobjectindjangoquerysetannotation【发布时间】:2018-09-1314:36:25【问题描述】:假设我有以下模型:classTestModel(models.Model):some_integer=models.IntegerField()我有这个模型的... 查看详情

为查询集注释排名字段的正确方法

】为查询集注释排名字段的正确方法【英文标题】:Properwaytoannotatearankfieldforaqueryset【发布时间】:2019-03-1502:21:59【问题描述】:假设模型如下:classPerson(models.Model):name=models.CharField(max_length=20)classSession(models.Model):start_time=models.Ti... 查看详情

TF10139 错误:tf checkin 命令的变更集注释策略中的内部错误

】TF10139错误:tfcheckin命令的变更集注释策略中的内部错误【英文标题】:TF10139Error:InternalerrorinChangesetCommentsPolicyfortfcheckincommand【发布时间】:2018-04-2011:21:24【问题描述】:我在构建定义(vNext)中添加了一个powershell步骤。我想在... 查看详情

tfs签入时,提示“变更集注释策略中的内部错误……”

提示:变更集注释策略中的内部错误。加载变更集注释策略策略时出错(策略程序集“Microsoft.TeamFoundation.PowerTools.CheckinPolicies.ChangesetComments,Version=10.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”未注册。)。需要安装——TFSPowerTools插... 查看详情

为啥在 django 中进行大型查询(或一系列查询)后内存没有释放到系统?

】为啥在django中进行大型查询(或一系列查询)后内存没有释放到系统?【英文标题】:Whydoesn\'tmemorygetreleasedtosystemafterlargequeries(orseriesofqueries)indjango?为什么在django中进行大型查询(或一系列查询)后内存没有释放到系统?【发... 查看详情

将更新签入到 TFS 后编辑变更集注释

】将更新签入到TFS后编辑变更集注释【英文标题】:EditchangesetcommentafterupdateshavebeencheckedintoTFS【发布时间】:2013-06-1904:37:47【问题描述】:我刚刚切换到VS2012并且不熟悉它,在没有评论的情况下检查了一些重大更改。从那以后没... 查看详情

当用户更改下拉过滤器中的值时,Django过滤更新查询

】当用户更改下拉过滤器中的值时,Django过滤更新查询【英文标题】:Djangofiltersupdatequerywhenuserchangesvalueindropdownfilter【发布时间】:2021-02-0903:07:42【问题描述】:我有一个适用于我的模型的过滤器,它是该列中所有值的select。我... 查看详情

GraphQL 在 Django 中的一个请求中进行多个查询

】GraphQL在Django中的一个请求中进行多个查询【英文标题】:GraphQLmultiplequeriesinonerequestinDjango【发布时间】:2020-07-0811:48:56【问题描述】:我使用Django和石墨烯来构建API,但我想在一个查询中组合两个模型,模型的所有字段都是... 查看详情

发送请求时从数据库中删除 Swift Alamofire“+”号

】发送请求时从数据库中删除SwiftAlamofire“+”号【英文标题】:SwiftAlamofire"+"signremovedfromDBwhenrequestwassent【发布时间】:2021-02-1102:42:35【问题描述】:我们遇到了这个奇怪的问题。一旦我们发送我们的请求,“+”就会在数... 查看详情

Django - 查询列表中的任何项目在多对多字段中的任何对象

】Django-查询列表中的任何项目在多对多字段中的任何对象【英文标题】:Django-QueryforanyobjectswhereanyitemfromlistisinManytoManyfield【发布时间】:2017-04-1215:02:28【问题描述】:我在Django中有一个模型,它有一个名为“accepted_insurance”的... 查看详情

使用 JavaScript 提交时从 DOM 中删除所有空表单字段

】使用JavaScript提交时从DOM中删除所有空表单字段【英文标题】:DeletingallEmptyFormFieldsfromDOMonsubmitwithJavaScript【发布时间】:2021-01-2321:46:03【问题描述】:所以我正在处理从另一个开发人员那里继承的有条件的Shopify表单。基本上,... 查看详情

在运行时从静态 UITableView 中删除行

】在运行时从静态UITableView中删除行【英文标题】:DeletingrowsfromastaticUITableViewatruntime【发布时间】:2013-11-1223:05:54【问题描述】:当所有部分和行都在nib中静态定义时,是否可以在运行时从UITableView中删除行?在下面的故事板场... 查看详情

构建请求 URL 以通过同一字段多次过滤 Django 查询集

】构建请求URL以通过同一字段多次过滤Django查询集【英文标题】:BuildrequestURLtofilterDjangoquerysetmultipletimesbythesamefield【发布时间】:2019-02-0507:04:30【问题描述】:我想使用Q多次过滤同一字段的Django查询集,以包含/排除该字段中具... 查看详情

(转)解决swagger跨项目或跨程序集注释不显示问题(代码片段)

     原文地址:https://www.cnblogs.com/ricolee/p/swagger-summary.html背景#我们在使用Swagger生成.NETCoreWebApi项目接口文档时候,发现接口的入参和出参的注释是看不见的,如下:但是我想要结果是这样:原因分析以及方案#... 查看详情

单击并在数据库中更新时在 Django 中编辑表单字段

】单击并在数据库中更新时在Django中编辑表单字段【英文标题】:EditformfieldinDjangoonclickandupdateindatabase【发布时间】:2014-06-0222:52:38【问题描述】:这就是我要找的。我有一个UpdateView,它使用从数据库加载的字段从CreateView呈现... 查看详情

使用查询检索数据时从 varchar 中删除特定字符

】使用查询检索数据时从varchar中删除特定字符【英文标题】:Removeaparticularcharacterfromvarcharwhileretrievingdatausingquery【发布时间】:2009-09-1706:08:03【问题描述】:我想在从表中检索varchar时删除特定字符。查询如下所示:SELECTServiceNam... 查看详情

MySQL查询返回按一个字段分组的表的所有字段,但仅当该分组在另一个字段中有多个值时

...组的表的所有字段,但仅当该分组在另一个字段中有多个值时【英文标题】:MySQLquerytoreturnallfieldsofatablegroupedbyonefieldbutonlywherethatgroupinghasmorethanonevalueinanotherfield【发布时间】:2015-09-2820:43:36【问题描述】:有人可以帮帮我吗?... 查看详情

在 Django Shell 中更改模型字段

】在DjangoShell中更改模型字段【英文标题】:ChangingmodelfieldwithintheDjangoShell【发布时间】:2015-12-3005:13:34【问题描述】:有没有使用Djangoshell来修改字段值?我可以创建、删除和查询模型,但我不知道如何更改现有字段值。classGame... 查看详情