61

私はこのようなモデルを持っています:

class Task(models.Model):
    progress = models.PositiveIntegerField()
    estimated_days = models.PositiveIntegerField()

Sum(progress * estimated_days)ここで、データベース レベルで計算を行いたいと思います。Django Aggregation を使用すると、各フィールドの合計を取得できますが、フィールドの乗算の合計は取得できません。

4

4 に答える 4

93

Django 1.8 以降では、集計に式を渡すことができます。

 from django.db.models import F

 Task.objects.aggregate(total=Sum(F('progress') * F('estimated_days')))['total']

定数も利用可能で、すべてを組み合わせることができます。

 from django.db.models import Value

 Task.objects.aggregate(total=Sum('progress') / Value(10))['total']
于 2015-06-22T12:09:19.990 に答える
76

更新: Django >= 1.8の場合は、@kmmbvnr が提供する回答に従ってください。

Django ORM を使用して可能です:

これがあなたがすべきことです:

from django.db.models import Sum

total = ( Task.objects
            .filter(your-filter-here)
            .aggregate(
                total=Sum('progress', field="progress*estimated_days")
             )['total']
         )

注: 2 つのフィールドの型が異なる場合 ( integer&floatなど)、返したい型を最初のパラメーターとして渡す必要があります。Sum

遅い答えですが、同じものを探している人に役立つと思います。

于 2013-11-10T09:22:50.847 に答える
2

編集済み (Django 1.8 以降)

Django 1.8 以降、以下を使用できますF

from django.db.models import F. Sum

total = ( 
    Task
    .objects
    .aggregate(total=Sum(F('progress') * F('estimated_days'))) 
    ['total']
)

古い回答 (Django 1.8 より前)

この回答は2012年に書かれ、django 1.8は2015年に公開されました

いくつかのオプションがありますか:

  1. 生のクエリ
  2. Emulbreh の文書化されていないアプローチ
  3. 3 番目のフィールドprogress_X_estimated_daysを作成し、上書き保存メソッドで更新します。次に、この新しいフィールドを介して集計を行います。

上書き:

class Task(models.Model):
   progress = models.PositiveIntegerField()
   estimated_days = models.PositiveIntegerField()
   progress_X_estimated_days = models.PositiveIntegerField(editable=False)

   def save(self, *args, **kwargs):
      progress_X_estimated_days = self.progress * self.estimated_days
      super(Task, self).save(*args, **kwargs)
于 2012-08-28T21:17:12.147 に答える