Abfrage als GROUP BY in Django

Shubham Vora 15 Februar 2024
  1. Erstellen Sie eine GROUP BY-Abfrage in Django
  2. Verwenden Sie mehrere Aggregationen mit der GROUP BY-Abfrage
  3. GROUP BY Datensätze mit mehreren Spalten
  4. Datensätze aus jeder Gruppe filtern
Abfrage als GROUP BY in Django

Die meisten von Ihnen sind mit SQL vertraut und wissen, wie man SQL-Abfragen mit der Klausel GROUP BY schreibt, um Daten in Gruppen abzurufen. Mit der Klausel GROUP BY können wir eine Gruppe von Datensätzen basierend auf den einspaltigen oder mehrspaltigen Werten erstellen und eine Aggregatfunktion ausführen.

In diesem Artikel gehen wir davon aus, dass wir an der Datenbank Bike arbeiten, die die Bike_id, Bike_name, Bike_brand, Bike_color, Bike_bought_date, Is_bike_premium, Bike_price usw. enthält .

Wir werden lernen, verschiedene Operationen mit der GROUP BY-Klausel in der obigen Bike-Datenbank durchzuführen. Außerdem werden wir zuerst SQL-Abfragen mit der GROUP BY-Klausel schreiben und sie in Python konvertieren, damit die Leser sie leicht verstehen und schnell lernen können, Abfragen in Django zu schreiben.

Erstellen Sie eine GROUP BY-Abfrage in Django

Angenommen, wir möchten die Anzahl der Fahrräder nach ihrer Farbe zählen. Einfach ausgedrückt, wir möchten eine Gruppe von Fahrrädern nach ihren Farben erstellen, und dafür haben wir die folgende SQL-Abfrage geschrieben.

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

Als Ausgabe der obigen SQL-Abfrage erhalten wir 2 Spalten. Einer ist Bike_color und ein anderer ist Total_Bikes, der die Anzahl der Fahrräder einer bestimmten Farbe darstellt.

Jetzt konvertieren wir die obige SQL-Abfrage in Python-Code, um das gleiche Ergebnis zu erhalten.

from django.db.models import Count

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

Ausgang:

django groupby erstellen

  1. values() – Ersetzt die GROUP BY-Klausel der SQL-Abfrage. Welche Spalte auch immer wir mit der GROUP BY-Klausel in der SQL-Abfrage verwenden, die wir als Argumente der values()-Methode verwenden müssen.
  2. annotate() – Die Methode annotate() nimmt die Aggregatfunktion als Argument, das auf jede Gruppe angewendet wird.

Auf diese Weise können wir eine Gruppe von Fahrrädern nach ihrer Farbe erstellen und die Anzahl der Fahrräder derselben Farbe mit der Python-Abfrage zählen.

Wenn Benutzer die Funktion annotate() vor values() aufrufen, wird die Aggregatfunktion nicht auf die Gruppenzeile, sondern auf den gesamten Datensatz angewendet. Stellen Sie also die Reihenfolge der Methoden sicher, die Sie beim Schreiben von Abfragen verwenden.

Verwenden Sie mehrere Aggregationen mit der GROUP BY-Abfrage

Hier werden wir eine Gruppe von Fahrrädern nach ihrer Farbe erstellen. Danach verwenden wir die Aggregationsfunktion Count(), um Fahrräder jeder Farbe zu zählen, und die Aggregationsfunktion Min(), um aus jeder Gruppe ein Fahrrad mit minimalen Kosten zu erhalten.

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

Unten haben wir die obige SQL-Abfrage in Python-Code konvertiert.

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")
)

Ausgang:

django groupby multiple

Auf diese Weise haben wir die multiplen Aggregatfunktionen Count() und Min() mit der group by-Abfrage in Python verwendet.

GROUP BY Datensätze mit mehreren Spalten

In der folgenden SQL-Abfrage haben wir die Felder Bike_color und Is_bike_premium mit der GROUP BY-Klausel verwendet. Die Abfrage gruppiert die Datensätze nach ihrer Farbe und ob sie sich in einer Premium-Kategorie befinden.

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

Wir müssen mehrere Felder innerhalb der values()-Methode hinzufügen, um die obige SQL-Abfrage in Python-Code umzuwandeln.

from django.db.models import Count

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

Ausgang:

django groupby mehrere Spalten

Datensätze aus jeder Gruppe filtern

In diesem Abschnitt gruppieren wir alle Datensätze der Tabelle Bike nach ihrer Farbe und filtern alle Nicht-Premium-Bikes aus jeder Gruppe heraus. Einfach gesagt, wir werden eine Gruppe von Nicht-Premium-Bikes nach ihrer Farbe zusammenstellen.

Wir haben die WHERE-Klausel in der folgenden SQL-Abfrage verwendet, um die Fahrräder zu filtern.

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

Um die obige SQL-Abfrage in einen Python-Code umzuwandeln, haben wir die filter()-Methode von Python verwendet und die Filterbedingung als Argument übergeben.

from django.db.models import Count

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

Ausgang:

Django-Gruppenfilter

In diesem Artikel haben wir gelernt, wie man GROUP BY-Abfragen in Django erstellt. Außerdem haben wir die verschiedenen Anwendungsfälle der Gruppieren nach-Abfragen gesehen.

Außerdem können Benutzer die group by-Abfragen mit der orderBy()-Methode verwenden, um die Datensätze jeder Gruppe zu sortieren.

Shubham Vora avatar Shubham Vora avatar

Shubham is a software developer interested in learning and writing about various technologies. He loves to help people by sharing vast knowledge about modern technologies via different platforms such as the DelftStack.com website.

LinkedIn GitHub

Verwandter Artikel - Django SQL