Django
モデル集約
サーチ…
前書き
集約は、モデルから派生したオブジェクトの(個々のおよび/またはグループの)行に対する操作の実行を可能にするメソッドです。
平均値、最小値、最大値、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.models
のCount
使用して、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
は、author
とcount
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
は、author
とtotal_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