【问题标题】:Can we do a Sum on CharField in Django ORM?我们可以在 Django ORM 中对 CharField 进行求和吗?
【发布时间】:2018-11-16 21:25:19
【问题描述】:

我在 Django ORM 中的模型是这样的

class Test(Modelbase):
    id = models.IntegerField(null=True, blank=True)
    amount = models.CharField(max_length=255)

我想为 id 列表添加金额。唯一的问题是金额字段是CharField。如何为 amount 字段应用 sum?

Test.objects.filter(id__in=[1,2,3]).aggregate(Sum('amount'))

我为此使用Django=1.9.1

【问题讨论】:

  • 如何添加字符?为什么数量是一个字符字段?不应该是整数还是浮点数?
  • @ArpitSolanki 是的,金额应该在浮动字段中。但我们现在不能改变它。还有一些其他的教学过程。
  • 将您的CharField() 更改为IntegerField(),如果您不想丢失数据,只需添加一个名为amount2 的第二个字段为IntegerField(运行makemigrations)然后循环它们通过将amount 的值添加到amount2。在循环之后,现在删除字段amount(运行make migrations),将amount2重命名为amount(run make migrations),然后你就可以使用SUM了。这有点棘手,你最终会得到一个IntergerField 能够使用Sum
  • 这里的Modelbase 是什么?
  • 也许使用 python sum,但这并不完全是 django ORM。 values_list('amout',flat=True),并使用sum()

标签: django django-orm


【解决方案1】:

你可以试试annotatecast:

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

Test.objects.filter(id__in=[1,2,3]
    ).annotate(as_float=Cast('amount', FloatField())
    ).aggregate(Sum('as_float'))

注意对于 django Cast source Cast 或者

from django.db.models import Sum, Func, F

Test.objects.annotate(
    num=Func(
        F('amount'),
        template='%(function)s(%(expressions)s AS %(type)s)',
        function='Cast', type='float')
   ).aggregate(Sum('num'))

【讨论】:

  • 无法在这个 Django 版本中导入 Cast。
  • 我们可以使用额外的然后聚合吗?
  • 很高兴为您提供帮助。
  • 你成就了我的一天。真棒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多