Django ORM zur Datenabfrage ist eine der stärksten Funktionen von Django. QuerySet ist das grundlegende Werkzeug, um Daten effizient aus Django-Modellen abzurufen, und mit diesem Werkzeug können selbst komplexe Datenabfragen einfach bearbeitet werden. In diesem Beitrag werden wir uns mit was ein QuerySet ist, wie man es nutzen kann und verschiedenen Funktionen zur Datenabfrage beschäftigen.


1. Was ist ein QuerySet?

QuerySet ist eine Sammlung von Objekten, die in Django ORM verwendet wird, um Daten von einer Datenbank abzurufen oder zu manipulieren. Einfach gesagt, ist ein QuerySet eine Sammlung von Ergebnissen, die aus einer Datenbankabfrage resultieren. Mit einem QuerySet können Modellobjekte abgerufen, gefiltert und bearbeitet werden.

Ein QuerySet kapselt die Interaktion mit der Datenbank, sodass Entwickler Daten in intuitivem Python-Code abfragen oder manipulieren können, ohne SQL direkt schreiben zu müssen.

Django QuerySet Infografik

Was man mit einem QuerySet tun kann

  • Datenabfrage: Abfrage von in der Datenbank gespeicherten Datensätzen unter verschiedenen Bedingungen.
  • Filtern: Mehrere Bedingungen anwenden, um nur die gewünschten Daten auszuwählen.
  • Sortieren und Slicing: Daten in der gewünschten Reihenfolge sortieren oder in einem bestimmten Bereich abrufen.

2. Arten von grundlegenden Abfragemethoden und Anwendungsbeispiele

Django ORM bietet verschiedene grundlegende Abfragemethoden an. Diese Methoden sind sehr nützlich, um Daten einfach abzufragen und zu filtern.

2.1 all()

Eine Methode, die verwendet wird, um alle Daten eines Modells abzurufen.

from myapp.models import Post

posts = Post.objects.all()
  • Post.objects.all() ruft alle Objekte des Post-Modells ab.

2.2 filter()

Eine Methode, die verwendet wird, um nur Objekte abzurufen, die bestimmten Bedingungen entsprechen.

published_posts = Post.objects.filter(status='published')
  • filter() gibt Objekte zurück, die den Bedingungen entsprechen, und das Ergebnis ist ein QuerySet.

2.3 exclude()

Eine Methode, die verwendet wird, um Objekte abzurufen, die bestimmten Bedingungen nicht entsprechen.

draft_posts = Post.objects.exclude(status='published')
  • exclude() gibt im Gegensatz zu filter() Objekte zurück, die nicht den Bedingungen entsprechen.

2.4 get()

Eine Methode, die verwendet wird, um ein einzelnes Objekt abzurufen, das bestimmten Bedingungen entspricht. Beachten Sie, dass ein Fehler auftritt, wenn kein oder mehr als ein Objekt vorhanden ist.

post = Post.objects.get(id=1)
  • get() wird verwendet, um genau ein Objekt abzurufen; wenn kein oder mehrere Objekte vorhanden sind, tritt eine DoesNotExist oder MultipleObjectsReturned Ausnahme auf.

3. Operatoren und Filtern im ORM

QuerySet kann verschiedene Operatoren nutzen, um komplexe Filterbedingungen zu verarbeiten. Diese Operatoren ermöglichen das Filtern von Daten nach sehr spezifischen Bedingungen.

3.1 exact

Wird verwendet, um genau übereinstimmende Werte zu finden.

post = Post.objects.filter(title__exact='My First Post')
  • title__exact filtert Objekte, deren Titel genau 'My First Post' ist.

3.2 icontains

Wird verwendet, um zu suchen, ob ein Teilstring unabhängig von der Groß- und Kleinschreibung enthalten ist.

posts = Post.objects.filter(title__icontains='django')
  • title__icontains ruft alle Beiträge ab, deren Titel 'django' enthält.

3.3 gt, lt (größer, kleiner)

Wird verwendet, um Bedingungen für größere oder kleinere Werte für Zahlen oder Datumswerte festzulegen.

recent_posts = Post.objects.filter(publish_date__gt='2024-01-01')
  • publish_date__gt filtert Post, die nach 2024-01-01 veröffentlicht wurden. gt steht für greater than, lt steht für less than.

Darüber hinaus können auch verschiedene andere Operatoren wie startswith, endswith und in verwendet werden, um verschiedene Filterbedingungen einfach zu implementieren.


4. Rückverweise: Abfragen von Beziehungen zwischen Modellen mit Fremdschlüsseln

Im Django ORM ermöglicht Rückverweis das Abrufen von Daten durch die Beziehungen zwischen Modellen, die durch einen Fremdschlüssel verbunden sind. Mit Rückverweisen können Sie die Beziehungen zwischen Eltern und Kindern in relationalen Datenbanken bequem abfragen.


4.1 Rückverweis mit related_name

Wenn Sie einen Fremdschlüssel definieren, können Sie die Option related_name verwenden, um leicht lesbare Namen für Rückverweise zu nutzen.

Beispiel
class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    text = models.TextField()
Verwendung
post = Post.objects.get(id=1)
comments = post.comments.all()
  • Mit post.comments.all() können Sie alle Kommentare zu diesem Beitrag abrufen. Wenn related_name nicht festgelegt wurde, wird standardmäßig der Name comment_set verwendet.

Fazit

Das QuerySet von Django ORM ist ein starkes Werkzeug zur Interaktion mit der Datenbank, mit dem Sie Daten effizient abfragen und manipulieren können, dank einer Vielzahl von Methoden und Operatoren. In diesem Beitrag haben wir die grundlegenden Verwendungsmöglichkeiten von QuerySets sowie das Filtern und Rückverweisen von Daten betrachtet.

Die oben erwähnten Themen sind nur eine grundlegende Einführung in die Abfragefunktionen des ORM. Tatsächlich hat Django's QuerySet noch viel mehr und mächtigere Methoden zu bieten, mit denen sich Daten abfragen lassen. In Zukunft werde ich Posts schreiben, die verschiedene Methoden des QuerySets einzeln vorstellen und analysieren.

Im nächsten Beitrag werden wir uns mit der Leistungsoptimierung von QuerySets und dem Konzept der lazy evaluation befassen, um herauszufinden, wie man Daten effizienter abrufen kann. Seien Sie gespannt!