Table of Contents
Wenn Sie mit Django arbeiten, ist das Verständnis von QuerySets entscheidend für eine effiziente Interaktion mit Ihrer Datenbank. In diesem Tutorial führe ich Sie anhand eines einfachen Contact-Modells durch die Einzelheiten von QuerySets. Dabei erkläre ich, was jeder Befehl tut, warum er nützlich ist und wie Sie ihn in realen Szenarien anwenden können. Wenn Sie gerade erst mit Django beginnen oder Ihre Fähigkeiten verbessern möchten, sind Sie hier richtig.
Die Bühne bereiten: Das Kontaktmodell
Beginnen wir mit der Erstellung eines kleinen Kontaktmodells. Stellen Sie sich vor, Sie erstellen ein Adressbuch, in dem jeder Kontakt einen Vor- und Nachnamen sowie eine E-Mail-Adresse hat. So sieht das in Django aus:
from django.db import models class Contact(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) email = models.EmailField(unique=True) def __str__(self): return f"{self.first_name} {self.last_name}"
Dieses Modell ist ziemlich unkompliziert. Die Felder first_name und last_name sind CharFields mit einer maximalen Länge von 50 Zeichen, während das Feld email eindeutig ist, sodass keine doppelten E-Mail-Adressen vorhanden sind. Die Methode __str__ gibt eine schöne Darstellung des Kontakts zurück – perfekt zum Debuggen oder Anzeigen von Daten.
Führen Sie Ihre Migrationen aus, um dieses Modell auf Ihre Datenbank anzuwenden:
python manage.py makemigrations python manage.py migrate
Nachdem das Modell fertig ist, tauchen wir in QuerySets ein.
Was ist ein QuerySet?
Ein QuerySet ist im Wesentlichen eine Sammlung von Datenbankabfragen. Betrachten Sie es als eine Möglichkeit, Daten aus Ihrer Datenbank abzurufen, zu filtern und zu bearbeiten. Das Schöne an QuerySets ist, dass sie „lazy“ sind, d. h. sie greifen erst auf die Datenbank zu, wenn Sie sie explizit auswerten. Dies macht sie sowohl leistungsstark als auch effizient.
Lassen Sie uns unsere Datenbank mit einigen Beispieldaten füllen, bevor wir QuerySets erkunden.
Hinzufügen von Beispieldaten
Starten Sie die Django-Shell, um einige Kontakte zu erstellen:
python manage.py shell
Innerhalb der Schale:
from app.models import Contact Contact.objects.create(first_name="Alice", last_name="Smith", email="alice@example.com") Contact.objects.create(first_name="Bob", last_name="Jones", email="bob@example.com") Contact.objects.create(first_name="Charlie", last_name="Brown", email="charlie@example.com") Contact.objects.create(first_name="Diana", last_name="Prince", email="diana@example.com")
Jetzt haben wir einige Daten, mit denen wir arbeiten können. Tauchen wir in QuerySets ein und sehen wir, was wir tun können.
Abrufen aller Datensätze
Das einfachste QuerySet ist Contact.objects.all(). Damit werden alle Datensätze aus der Tabelle „Contact“ abgerufen.
contacts = Contact.objects.all() print(contacts)
Sie werden feststellen, dass die Daten nicht sofort abgerufen werden, sondern nur die Abfrage vorbereitet wird. Dies ist eine hervorragende Funktion von QuerySets, da dadurch unnötige Datenbankzugriffe vermieden werden, bis Sie die Daten benötigen.
Warum es verwenden?
Wenn Sie alles in Ihrer Tabelle sehen möchten, ist all() die richtige Wahl. Es ist auch der Ausgangspunkt für die Verkettung anderer Befehle, die wir als Nächstes behandeln werden.
Datensätze zählen
Möchten Sie wissen, wie viele Kontakte Sie haben? Verwenden Sie .count().
count = Contact.objects.all().count() print(f"Total Contacts: {count}")
Dadurch wird eine SELECT COUNT(*)-Abfrage an die Datenbank gesendet, was schneller ist, als alle Objekte zu laden und sie in Python zu zählen.
Warum es verwenden?
Wenn Sie eine schnelle Zusammenfassung Ihrer Daten benötigen, ist das Zählen von Datensätzen von unschätzbarem Wert.
Auf Existenz prüfen
Wenn Sie nur wissen möchten, ob Datensätze vorhanden sind, ist .exists() Ihr Freund.
exists = Contact.objects.all().exists() print(f"Contacts Exist: {exists}")
Dies ist viel schneller als das Abrufen aller Datensätze, da die Suche beendet wird, sobald die erste Übereinstimmung gefunden wird.
Warum es verwenden?
Perfekt für Szenarien wie bedingte Logik – wenn Daten vorhanden sind, tun Sie eine Sache, wenn nicht, tun Sie etwas anderes.
Abrufen bestimmter Datensätze
Manchmal wissen Sie genau, wonach Sie suchen. Verwenden Sie .get()
um einen einzelnen Datensatz anhand einer bestimmten Bedingung abzurufen:
alice = Contact.objects.get(email="alice@example.com") print(f"Found Contact: {alice}")
Der Fang
- Wenn kein Datensatz übereinstimmt, wird die Ausnahme „DoesNotExist“ ausgelöst.
- Wenn mehrere Datensätze übereinstimmen, wird eine MultipleObjectsReturned-Ausnahme.
Filtern von Daten
Was ist, wenn Sie alle Kontakte mit einem bestimmten Nachnamen möchten? Hier kommt .filter() ins Spiel.
smith_contacts = Contact.objects.filter(last_name="Smith") print(smith_contacts)
Dadurch wird ein QuerySet aller übereinstimmenden Datensätze erstellt. Sie können verschiedene Feldsuchen verwenden, um Ihre Suche zu verfeinern:
- icontains : Suche ohne Berücksichtigung der Groß-/Kleinschreibung.
- startswith : Stimmt mit dem Anfang einer Zeichenfolge überein.
- exact : Stimmt mit dem exakten Wert überein.
Zum Beispiel:
emails_with_example = Contact.objects.filter(email__icontains="example.com")
Warum es verwenden?
Das Filtern ist eine der häufigsten Operationen in jeder datenbankgestützten Anwendung. So können Sie sich auf die Daten konzentrieren, die Sie benötigen.
Ausschließen von Daten
Sie möchten alles außer einem bestimmten Datensatz? Verwenden Sie .exclude():
non_smith_contacts = Contact.objects.exclude(last_name="Smith") print(non_smith_contacts)
Ergebnisse sortieren
Mit .order_by() können Sie Ihre Daten ganz einfach sortieren.
ordered_contacts = Contact.objects.all().order_by("first_name") print(ordered_contacts)
Um in absteigender Reihenfolge zu sortieren, stellen Sie dem Feld ein - voran:
descending_contacts = Contact.objects.all().order_by("-last_name")
Aggregationen
Wenn Sie mit numerischen Daten arbeiten, verfügt Django über integrierte Aggregationsfunktionen wie Count , Sum , Avg , Max und Min . Zählen wir, wie viele eindeutige Nachnamen wir haben:
from django.db.models import Count unique_last_names = Contact.objects.values("last_name").distinct().count() print(f"Unique Last Names: {unique_last_names}")
Kommentieren von Abfragesätzen
Mit Annotationen können Sie Ihrem QuerySet berechnete Felder hinzufügen. Beispielsweise möchten Sie möglicherweise dynamisch ein Feld „full_name“ erstellen:
from django.db.models import Value from django.db.models.functions import Concat contacts = Contact.objects.annotate( full_name=Concat('first_name', Value(' '), 'last_name') ) for contact in contacts: print(contact.full_name)
Ergebnisse aufteilen
Sie benötigen nur eine Teilmenge Ihrer Daten? Dann verwenden Sie Slicing:
top_two_contacts = Contact.objects.all()[:2]
Rohes SQL
Wenn Sie neugierig sind, was Django hinter der Haube macht, können Sie sich das reine SQL ansehen:
print(Contact.objects.all().query)
Abschluss
Django QuerySets sind unglaublich leistungsstark und ihre Beherrschung ist ein entscheidender Vorteil für die Arbeit mit Daten in Ihren Projekten. Egal, ob Sie Datensätze filtern, Zeilen zählen oder komplexe Abfragen durchführen, QuerySets bieten Ihnen die Tools, die Sie benötigen, um die Arbeit effizient zu erledigen.
Wenn Sie die Grundlagen verstehen und sich in fortgeschrittenere Operationen vertiefen, können Sie sauberen, optimierten Code schreiben, der die ORM-Funktionen von Django voll ausnutzt. Wenn Sie diesen Leitfaden hilfreich fanden, können Sie ihn gerne weitergeben – vielleicht ist er genau die Ressource, nach der jemand anderes sucht!