HOWTO · Django

Django で GROUP BY としてクエリを実行する

この記事では、Django アプリで group by としてクエリを実行する方法を学習します。

このページの内容

あなたのほとんどは SQL に精通しており、GROUP BY 句を使用してグループ内のデータを取得する SQL クエリを作成する方法を知っています。 GROUP BY 句を使用すると、単一列または複数列の値に基づいてレコードのグループを作成し、集計関数を実行できます。

この記事では、Bike_idBike_nameBike_brandBike_colorBike_bought_dateIs_bike_premiumBike_price などを含む Bike データベースで作業していると想定します。 .

上記の Bike データベースで GROUP BY 句を使用してさまざまな操作を実行する方法を学習します。 また、最初に GROUP BY 句を使用して SQL クエリを作成し、それを Python に変換して、読者が簡単に理解し、Django でのクエリの作成方法をすばやく学習できるようにします。

Django で GROUP BY クエリを作成する

色に応じて自転車の数を数えたいとします。 簡単に言えば、色に応じて自転車のグループを作成したいので、以下の SQL クエリを作成しました。

SELECT
    Bike_color,
    COUNT(Bike_id) AS Total_bikes
FROM
    Bike
GROUP BY
    Bike_color

上記の SQL クエリの出力として、2つの列が得られます。 1つは Bike_color で、もう 1つは Total_Bikes で、特定の色の自転車の数を表します。

ここで、上記の SQL クエリを Python コードに変換して、同じ結果を取得します。

from django.db.models import Count

Bike.objects.values("Bike_color").annotate(Total_bikes=Count("Bike_id"))

出力:

django groupby を作成

  1. values() - SQL クエリの GROUP BY 句を置き換えます。 values() メソッドの引数として使用する必要がある SQL クエリの GROUP BY 句で使用している列。
  2. annotate() - annotate() メソッドは、集約関数を引数として取り、すべてのグループに適用します。

このようにして、色に応じて自転車のグループを作成し、Python クエリを使用して同じ色の自転車の数を数えることができます。

ユーザーが values() の前に annotate() 関数を呼び出すと、グループの行ではなくレコード全体に集計関数が適用されます。 そのため、クエリの作成中に使用するメソッドの順序を確認してください。

GROUP BY クエリで複数の集計を使用する

ここでは、色ごとにバイクのグループを作成します。 その後、Count() 集計関数を使用してすべての色の自転車を数え、Min() 集計関数を使用してすべてのグループから最小コストの自転車を取得します。

SELECT
    Bike_color,
    COUNT(Bike_id) AS Total_bikes,
    MIN(Bike_price) As cheap_bike
FROM
    Bike
GROUP BY
    Bike_color

以下では、上記の SQL クエリを Python コードに変換しています。

from django.db.models import Count
from django.db.models import Min

Bike.objects.values("Bike_color").annotate(
    Total_bikes=Count("Bike_id"), cheap_bike=Min("Bike_price")
)

出力:

django groupby multiple

このように、Python の group by クエリで Count() および Min() 複数の集計関数を使用しました。

複数の列を持つGROUP BYレコード

以下の SQL クエリでは、Bike_color フィールドと Is_bike_premium フィールドを GROUP BY 句と共に使用しています。 クエリは、色とプレミアム カテゴリに属しているかどうかに従って、レコードをグループ化します。

SELECT
    Bike_color,
    Is_bike_premium,
    COUNT(Bike_id) AS Total_bikes,
FROM
    Bike
GROUP BY
    Bike_color,
    Is_bike_premium

上記の SQL クエリを Python コードに変換するには、values() メソッド内に複数のフィールドを追加する必要があります。

from django.db.models import Count

Bike.objects.values("Bike_color", "Is_bike_premium").annotate(
    Total_bikes=Count("Bike_id")
)

出力:

django groupby multiple columns

すべてのグループからレコードをフィルター処理する

このセクションでは、Bike テーブルのすべてのレコードのグループをその色に従って作成し、すべての非プレミアム バイクをすべてのグループからフィルタリングします。 簡単に言えば、色に応じて非プレミアムバイクのグループを作成します。

以下の SQL クエリで WHERE 句を使用してバイクをフィルター処理しました。

SELECT
    Bike_color,
    COUNT(Bike_id) AS Total_bikes
FROM
    Bike
WHERE
    Is_bike_premium = False
GROUP BY
    Bike_color

上記の SQL クエリを Python コードに変換するには、Python の filter() メソッドを使用し、フィルター条件を引数として渡します。

from django.db.models import Count

Bike.objects.values("Bike_color").filter(Is_bike_premium=False).annotate(
    Total_bikes=Count("Bike_id")
)

出力:

django groupby filter

この記事では、Django で GROUP BY クエリを作成する方法を学びました。 また、group by クエリのさまざまな使用例を見てきました。

また、ユーザーは orderBy() メソッドで group by クエリを使用して、すべてのグループのレコードを並べ替えることができます。