In einem früheren Beitrag habe ich vorgestellt, wie man mit Django ORM Daten verwaltet, also CRUD (Create, Read, Update, Delete)-Operationen. Diesmal möchte ich genauer analysieren, was der objects-Manager ist, wie er aufgebaut ist und was man damit tun kann. objects ist ein wichtiges Konzept, das man verstehen muss, um Django ORM richtig zu begreifen.


1. Was ist der objects-Manager?

Das häufigste Element in der Grundstruktur eines Django-Modells ist der objects-Manager. objects wird als Manager von Django-Modellen bezeichnet und ist zuständig für das Abrufen oder Manipulieren von Datenbankdatensätzen. Einfach gesagt, der objects-Manager fungiert als Brücke zwischen der Modellklasse und der Datenbank.

Diagramm des Django-Objektmanagers

Das Grundattribut objects der Modellklasse ist eine Instanz der Manager-Klasse, die von Django bereitgestellt wird. Über diese Instanz kommuniziert man mit der Datenbank und führt Operationen wie Erstellen, Suchen, Ändern und Löschen von Daten durch. Beispielsweise kann man mit Methoden wie Post.objects.all() oder Post.objects.create() auf die Daten zugreifen.


2. Die Rolle der Manager-Klasse

Die Manager-Klasse ist die standardmäßige Schnittstelle zur Datenbank, die Django-Modellen zugeordnet ist. Damit können verschiedene Abfragen durchgeführt werden. Standardmäßig erstellt Django für jedes Modell automatisch einen Manager mit dem Namen objects, der für die meisten CRUD-Operationen verwendet wird.

Wie CRUD über objects implementiert wird, wissen Sie wahrscheinlich bereits oder haben Erfahrung damit. Beispielcode wurde im vorherigen Beitrag behandelt, daher werde ich hier darauf verzichten.


3. Erstellen eines benutzerdefinierten Managers

Der standardmäßig bereitgestellte objects-Manager ist sehr nützlich, aber manchmal besteht die Notwendigkeit, bestimmte Abfrage-Logik wiederzuverwenden oder komplexere Abfragen durchzuführen. In solchen Fällen können Sie einen benutzerdefinierten Manager erstellen, um die gewünschten Funktionen hinzuzufügen.

3.1 Definieren einer benutzerdefinierten Manager-Klasse

Zum Beispiel erstellen wir einen benutzerdefinierten Manager, der nur die veröffentlichten Beiträge filtert.

from django.db import models

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(status='published')

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    status = models.CharField(max_length=10, choices=[('draft', 'Draft'), ('published', 'Published')])
    publish_date = models.DateTimeField(auto_now_add=True)

    # Hinzufügen eines benutzerdefinierten Managers neben dem Standard-objects-Manager
    published = PublishedManager()

Im obigen Beispiel wurde ein benutzerdefinierter Manager namens PublishedManager definiert und diesem Post-Modell hinzugefügt. Dieser PublishedManager filtert nur die Beiträge mit dem Status 'published' und gibt sie zurück. Jetzt können Sie nur die veröffentlichten Beiträge erhalten, indem Sie Post.published.all() aufrufen.

3.2 Nutzung des benutzerdefinierten Managers

  • Reduzierung des wiederholten Codes: Anstatt jedes Mal Filterbedingungen hinzuzufügen, kann der benutzerdefinierte Manager verwendet werden, um den wiederholten Code zu minimieren.
  • Kapselung spezialisierter Abfrage-Logik: Die Abfrage-Logik kann auf bestimmte Geschäftslogiken zugeschnitten und innerhalb des Modells ordentlich verwaltet werden.

4. Verschiedene Aufgaben mit dem objects-Manager

Der objects-Manager von Django unterstützt neben den standardmäßig bereitgestellten CRUD-Funktionen auch eine Vielzahl weiterer Datenbankoperationen.

4.1 Daten filtern

  • filter(): Ruft mehrere Objekte ab, die den Bedingungen entsprechen.
    published_posts = Post.objects.filter(status='published')
  • exclude(): Ruft Objekte ab, die nicht den spezifischen Bedingungen entsprechen.
    draft_posts = Post.objects.exclude(status='published')

4.2 Sortierung und Slicing

  • Sortierung: Mit der order_by()-Methode können Sie die Daten sortieren.
    recent_posts = Post.objects.all().order_by('-publish_date')
  • Slicing: Ähnlich wie bei Python-Listen kann auch das Queryset durch Slicing bestimmte Datenbereiche abrufen.
    first_three_posts = Post.objects.all()[:3]

4.3 Verwendung von Aggregatfunktionen

Der objects-Manager bietet auch Aggregatfunktionen an. Wenn Sie beispielsweise die Anzahl der Beiträge wissen möchten, können Sie die count()-Methode verwenden.

post_count = Post.objects.count()

Darüber hinaus können Sie mit der aggregate()-Methode Aggregationsoperationen wie Durchschnitt oder Summe durchführen.

from django.db.models import Avg
average_length = Post.objects.aggregate(Avg('content_length'))

5. Funktionsweise des objects-Managers

Der objects-Manager erstellt intern Objekte vom Typ QuerySet. Ein QuerySet ist eine Sammlung von Abfragen, um Daten von der Datenbank abzurufen. Jedes Mal, wenn Methoden wie objects.all() oder objects.filter() aufgerufen werden, erzeugt Django ein QuerySet und sendet bei Bedarf die entsprechende Abfrage an die Datenbank, um Ergebnisse abzurufen.

Das QuerySet verwendet lazy evaluation. Dabei wird beim Erstellen des QuerySets nicht tatsächlich auf die Datenbank zugegriffen. Stattdessen wird die Datenbankabfrage zum Zeitpunkt des Bedarfs ausgeführt, was unnötige Abfrageausführungen vermeidet und eine effiziente Datenverarbeitung ermöglicht.


Fazit zu diesem Beitrag

Der objects-Manager von Django vereinfacht die Interaktion mit der Datenbank und hilft, Daten leichter zu verwalten. Neben den standardmäßig bereitgestellten CRUD-Funktionen können Sie benutzerdefinierte Manager definieren, um bestimmte Abfrage-Logiken wiederzuverwenden oder komplexere Aufgaben einfach durchzuführen. Darüber hinaus ermöglicht die lazy evaluation von QuerySets eine effiziente Datenverarbeitung.

Ein tiefes Verständnis des objects-Managers von Django ORM ermöglicht es Ihnen, Datenbanken effizienter zu verwalten und den Code sauber zu gestalten, während Sie Redundanzen vermeiden. Nutzen Sie die Möglichkeiten des Modellmanagers und implementieren Sie bei Bedarf benutzerdefinierte Manager, um die komplexe Datenverarbeitung in Ihren Webanwendungen viel einfacher und flexibler zu gestalten.

Im nächsten Beitrag werden wir uns ausführlich mit QuerySets und Datenabruf beschäftigen. Einer der Vorteile von ORM ist, dass "man kein SQL wissen muss", und um diese Vorteile richtig zu nutzen, wird der Inhalt des nächsten Beitrags äußerst wichtig sein. Freuen Sie sich auf den nächsten Beitrag.