サーチ…


前書き

集約は、モデルから派生したオブジェクトの(個々のおよび/またはグループの)行に対する操作の実行を可能にするメソッドです。

平均値、最小値、最大値、Querysetからの合計値

class Product(models.Model):
    name = models.CharField(max_length=20)
    price = models.FloatField()

すべての製品の平均価格を取得するには:

>>> from django.db.models import Avg, Max, Min, Sum
>>> Product.objects.all().aggregate(Avg('price'))
# {'price__avg': 124.0}

すべての製品の最低価格を取得するには:

>>> Product.objects.all().aggregate(Min('price'))
# {'price__min': 9}

すべての製品の最高価格を得るには:

>>> Product.objects.all().aggregate(Max('price'))
# {'price__max':599 }

すべての製品の価格の合計を得るには:

>>> Product.objects.all().aggregate(Sum('price'))
# {'price__sum':92456 }

外交の数を数える

class Category(models.Model):
    name = models.CharField(max_length=20)


class Product(models.Model):
    name = models.CharField(max_length=64)
    category = models.ForeignKey(Category, on_delete=models.PROTECT)

各カテゴリの製品番号を取得するには:

>>> categories = Category.objects.annotate(Count('product'))

これは、返された各インスタンスに<field_name>__count属性を追加します。

>>> categories.values_list('name', 'product__count')
[('Clothing', 42), ('Footwear', 12), ...]

キーワード引数を使用して、属性のカスタム名を指定できます。

>>> categories = Category.objects.annotate(num_products=Count('product'))

クエリーセットで注釈付きフィールドを使用することができます:

>>> categories.order_by('num_products')
[<Category: Footwear>, <Category: Clothing>]

>>> categories.filter(num_products__gt=20)
[<Category: Clothing>]

GROUP BY ... COUNT / SUM Django ORM相当

我々は、 annotate()values()order_by()およびdjango.db.modelsCount使用して、Django ORMでGROUP BY ... COUNTまたはGROUP BY ... SUM SQL同等のクエリを実行できますSumメソッドを使用します。

我々のモデルは次のようにしましょう:

   class Books(models.Model):
       title  = models.CharField()
       author = models.CharField()
       price = models.FloatField()

GROUP BY ... COUNT

  • Booksテーブルには、個別の著者ごとにいくつのブックオブジェクトが存在するかをカウントしたいとします。

    result = Books.objects.values('author')
                          .order_by('author')
                          .annotate(count=Count('author'))
    
  • resultは、 authorcount 2つの列を持つクエリーセットが含まれていcount

      author    | count
    ------------|-------
     OneAuthor  |   5
    OtherAuthor |   2
       ...      |  ...
    

GROUB BY ... SUM

  • Booksテーブルに存在する別個の著者ごとのすべての書籍の価格を合計したいとします。

     result = Books.objects.values('author')
                           .order_by('author')
                           .annotate(total_price=Sum('price'))
    
  • resultは、 authortotal_price 2つの列を持つtotal_priceが含まれています。

      author    | total_price
    ------------|-------------
     OneAuthor  |    100.35
    OtherAuthor |     50.00
        ...     |      ...
    


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow