【问题标题】:Using Values after Cast and Replace in Django ORM在 Django ORM 中转换和替换后使用值
【发布时间】:2022-10-05 01:14:55
【问题描述】:

虚拟数据:

field_1 price
lot 1 1,333.00
lot 1 348.39
lot 2 98.00

目标是添加价格的值

由于 price 是表示数字的字符串,因此 Cast 和 Replace 用于删除千位逗号分隔符并执行求和。

如果我想计算总和,它可以毫无问题地工作:

total_price = (
    myModel.objects.filter(status='Active', project_id=pid)
    .annotate(
        cleaned_total=Replace('price', Value(','), Value(''))
    )
    .annotate(float_total=Cast('cleaned_total', FloatField()))
    .aggregate(Sum('float_total'))
)

总价格输出: {'float_total__sum': 1779.39}

问题是我想对总和进行分组,为此我使用.values('field_1'),我希望结果是这样的:

<QuerySet [{'field_1': 'lot 1', 'float_total__sum': 1681.39}, {'field_1': 'lot 2', 'float_total__sum': 98.0}]

我试过的:

total_price_grouped = (
    myModel.objects.filter(status='Active', project_id=pid)
    .values('field_1')
    .annotate(
        cleaned_total=Replace('price', Value(','), Value(''))
    )
    .annotate(float_total=Cast('cleaned_total', FloatField()))
    .aggregate(Sum('float_total'))
)

但不幸的是,这给了我以下结果:{'float_total__sum': 1779.39}

如果我不使用 Cast and Replace,则总和将根据需要正确分组,但未正确添加带有千位逗号分隔符的值:

total_price_grouped = myModel.objects.filter(status='Active', project_id=pid).values('field_1').annotate(sum=Sum('price'))

我怎样才能通过结合valuesreplacecast 来计算总和?

【问题讨论】:

  • @HemalPatel您的意思是使用order_by?如果是这样,我认为我做错了,因为除了我已经知道如何进行分组(values('field_1'))之外,我做错了,我不知道如何将valuescast和@987654337结合起来@
  • 我必须创建虚拟模型并进行查询。我不记得确切的语法。但我提到的帖子可能对你有用!将尝试动手。如果你完成了,请告诉我。
  • @HemalPatel 我认为如果您自己尝试,您将面临同样的问题。也许我做错了什么,但不幸的是您提供的链接不起作用:(

标签: python django django-models django-views django-orm


【解决方案1】:

你只得到一个结果,因为你使用聚合

顺序也很重要。先注释,然后按 und sum 分组

myModel.objects.filter(status='Active', project_id=pid)
.annotate(
    cleaned_total=Replace('price', Value(','), Value(''))
)
.annotate(float_total=Cast('cleaned_total', FloatField()))
.values('field_1')
.order_by('field_1')
.annotate(grouped_totals=Sum('float_total')
)

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 2020-09-08
    • 2017-08-23
    • 2018-01-31
    • 2021-07-06
    • 1970-01-01
    • 2021-10-16
    • 2012-12-23
    • 2021-09-07
    相关资源
    最近更新 更多