Rolle von models.Model

Zunächst ist die grundlegendste Modellklasse in Django models.Model. Alle Django-Modelle werden durch Vererbung von models.Model definiert. Diese Klasse dient der Zuordnung meiner definierten Modelle zu Datenbanktabellen. Jede Modellklasse entspricht einer Tabelle der Datenbank, und die darin enthaltenen Felder werden zu den Spalten(columns) der Tabelle.

Wichtig ist, dass durch die Vererbung von models.Model mehrere nützliche Methoden bereitgestellt werden, die standardmäßig verwendet werden können:

  • save(): Methode zum Speichern eines Objekts in der Datenbank
  • delete(): Methode zum Löschen eines Objekts
  • objects.create(): Methode zum Erstellen und Speichern eines neuen Objekts
  • objects.filter(): Methode zum Abrufen von Objekten, die bestimmte Bedingungen erfüllen

Dank dieser Funktionen kann ich die leistungsstarken Funktionen des Django ORM einfach nutzen, indem ich nur von models.Model erbe.

Beziehung zwischen AbstractUser und CustomUser

Django bietet standardmäßig ein integriertes Benutzermodell namens auth.User. Dieses Modell kann standardmäßig verwendet werden, aber in den meisten Fällen möchten Benutzer das Benutzer-Modell anpassen. Beispielsweise möchte man möglicherweise zusätzliche Felder wie Telefonnummer oder Adresse einfügen.

Hier kommt AbstractUser ins Spiel. Diese Klasse ist eine abstrakte Klasse, die es ermöglicht, das von Django bereitgestellte Benutzer-Modell (d. h. auth.User) zu erweitern. Da auch AbstractUser von models.Model erbt, kann ich, wenn ich AbstractUser erbe und CustomUser definiere, alle Funktionen des ORM nahtlos nutzen.

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)

So definiertes CustomUser-Modell bietet alle Funktionen, die mit der Benutzer-Authentifizierung zusammenhängen, und ermöglicht gleichzeitig die freie Definition zusätzlicher Felder.

Rolle von models.Manager und AbstractUserManager

In Django-Modellen fungiert models.Manager als Schnittstelle zur Verarbeitung von Abfragen an die Datenbank. Über den standardmäßig bereitgestellten objects-Manager können Daten einfach abgerufen oder manipuliert werden. Dazu gehören Methoden wie filter(), get(), create().

Beim Benutzer-Modell kann AbstractUserManager genutzt werden, wenn eine Benutzererstellung erforderlich ist. AbstractUserManager erbt von models.Manager und bietet Methoden, die speziell für die Benutzererstellung gedacht sind (create_user(), create_superuser()).

from django.contrib.auth.models import BaseUserManager

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

    def create_superuser(self, email, password=None, **extra_fields):
        # Superusererstellungslogik
        pass

Durch die Anpassung der Benutzererstellungslogik zur Implementierung von CustomUserManager kann das Benutzer-Modell flexibel verwaltet werden.

Zusammenfassung: Beziehung zwischen Modellklassen

Zusammenfassend lässt sich sagen, dass die Beziehungen zwischen den Modellklassen in Django wie folgt sind:

  • models.Model: Basis-Klasse für alle Django-Modelle. Diese wird vererbt, um mit der Datenbank zu interagieren und ORM-Funktionalitäten bereitzustellen.
  • AbstractUser: Abstrakte Klasse, die von models.Model erbt. Sie ermöglicht die Definition von CustomUser.
  • AbstractUserManager: Erbt von models.Manager und ermöglicht die Anpassung der Benutzererstellungslogik.

Wenn Sie diese Struktur verstehen und nutzen, können Sie das Modellsystem von Django effizienter gestalten.