Bei der Entwicklung von Django-Anwendungen ist eines der ersten Dinge, mit denen wir konfrontiert werden, das grundlegende Datenbankmodell, das von models.Model erbt. In vielen Tutorials wird es nur nachgeahmt, aber wenn man die Struktur und die Prinzipien etwas tiefer betrachtet, kann man die Vorteile von Django ORM effektiver nutzen. In diesem Artikel werden wir uns eingehender mit der Vererbungsstruktur der Django-Modelle und der Definition benutzerdefinierter Benutzermodelle beschäftigen und die Zusammenstellung des Modellsystems von Django näher untersuchen.


models.Model: Die Basis aller Modelle

In Django erben alle Modellklassen von models.Model. Diese models.Model-Klasse spielt eine zentrale Rolle bei der Abbildung auf Datenbanktabellen. Jedes Modell wird zur Datenbanktabelle, und die Felder des Modells entsprechen den Spalten der Tabelle. Die Methoden, die diese Basisklasse bietet, ermöglichen die Kernfunktionen von Django ORM.

  • save(): Speichert das Objekt in der Datenbank
  • delete(): Löscht das Objekt
  • objects.create(): Erstellt und speichert ein Objekt
  • objects.filter(): Abfrage von Objekten, die bestimmte Bedingungen erfüllen

Allein durch die Ableitung von models.Model kann man die Funktionen von Django ORM ohne Einschränkungen nutzen. Dies ist ein Beispiel dafür, wie mächtig Django ORM gestaltet ist.


AbstractUser und CustomUser: Erweiterbare Benutzermodelle

Django bietet standardmäßig das auth.User-Modell an, aber die Anforderungen zur Erweiterung und Anpassung von Benutzermodellen variieren von Projekt zu Projekt. AbstractUser ist das abstrakte Benutzermodell von Django, das unter Berücksichtigung dieser Erweiterbarkeit bereitgestellt wird. Beispielsweise wird es verwendet, wenn man ein E-Mail-Feld oder Felder wie Telefonnummer oder Adresse hinzufügen möchte.

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=15, blank=True)
    address = models.CharField(max_length=255, blank=True)
Django-Modellvererbung

Durch die Definition von CustomUser auf diese Weise kann man die Funktionen von AbstractUser übernehmen und benutzerdefinierte Felder hinzufügen. Da AbstractUser ebenfalls von models.Model erbt, kann man die grundlegenden Methoden von Django ORM weiterhin verwenden.


models.Manager und AbstractUserManager: Abfragen der Datenbank und Logik zur Benutzererstellung

Der models.Manager, welcher die Rolle des Managers eines Modells übernimmt, ist eine Schnittstelle zur Verarbeitung von Abfragen an die Datenbank, die es ermöglicht, Methoden wie filter(), get() und create() über den standardmäßigen Manager objects zu verwenden. Wenn ein manager-spezifisches Benutzer-Modell wie CustomUser erforderlich ist, bietet Django die Manager-Klasse AbstractUserManager an. Mit dieser Klasse kann man die Logik zur Benutzererstellung anpassen.

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        # Logik zur Benutzererstellung
        pass

    def create_superuser(self, email, password=None, **extra_fields):
        # Logik zur Erstellung eines Superusers
        pass

Durch die Verwendung eines solchen Managers kann man flexibel auf verschiedene Situationen reagieren, die während des Benutzererstellungsprozesses auftreten können. AbstractUserManager erweitert models.Manager, sodass sie alle grundlegenden Funktionen für Datenbankabfragen beinhaltet.


Verständnis der Django-Modellvererbung

Ein Verständnis der Modellvererbung in Django ermöglicht ein effizienteres Design und eine effektivere Implementierung von Modellen. Dies kann kurz zusammengefasst werden:

  1. models.Model: Die Basis-Klasse aller Django-Modelle, die eine Zuordnung zur Datenbank herstellt und ORM-Funktionen bietet.
  2. AbstractUser: Eine abstrakte Klasse, die von models.Model erbt. Durch die Vererbung von dieser Klasse kann CustomUser als benutzerdefiniertes Benutzer-Modell mit den Funktionalitäten von models.Model einfach definiert werden.
  3. AbstractUserManager: Ein Manager, der von models.Manager erbt und spezifisch für die Benutzererstellung ist. Diese Klasse ermöglicht es, die Logik zur Benutzererstellung einfach anzupassen.

Zusammenfassend lässt sich sagen, dass die Struktur von Django-Modellen sehr flexibel und gleichzeitig leistungsstark gestaltet ist. Auch bei der Erweiterung von Benutzermodellen und dem Hinzufügen benutzerdefinierter Felder kann man durch ein Verständnis der ORM-Funktionalitäten und Strukturen von AbstractUser und models.Model ein effizienteres sowie skalierbares Datenbankdesign erreichen. Wenn man diese Modellstruktur von Django gut nutzt, kann der Entwickler mit weniger Aufwand komplexe Datenbankmodelle aufbauen.