De rol van models.Model

De basis model klasse in Django is models.Model. Alle Django-modellen worden gedefinieerd door models.Model te erven. Deze klasse zorgt ervoor dat mijn gedefinieerde model wordt gemapt naar een database tabel. Elke model klasse is als het ware een tabel van de database en de velden binnen de klasse zijn de kolommen van die tabel.

Een belangrijk punt is dat er meerdere handige methoden worden aangeboden die standaard beschikbaar zijn door het erven van models.Model:

  • save(): methode om een object op te slaan in de database
  • delete(): methode om een object te verwijderen
  • objects.create(): methode om een nieuw object te creëren en op te slaan
  • objects.filter(): methode om objecten op te vragen die aan bepaalde voorwaarden voldoen

Met deze functionaliteiten kun je eenvoudig de krachtige functies van de Django ORM gebruiken door simpelweg models.Model te erven.

De relatie tussen AbstractUser en CustomUser

Django heeft standaard een ingebouwd gebruikersmodel genaamd auth.User. Je kunt dit model standaard gebruiken, maar in de meeste gevallen wil je het gebruikersmodel graag aanpassen. Bijvoorbeeld, als je extra velden zoals telefoonnummer of adres wilt toevoegen.

Wat je in dat geval gebruikt is AbstractUser. Deze klasse is een abstracte klasse die het mogelijk maakt om het standaard gebruikersmodel van Django (dat wil zeggen auth.User) uit te breiden. Aangezien AbstractUser ook models.Model erft, kan ik CustomUser definiëren door AbstractUser te erven, en heb ik toegang tot alle functionaliteiten van de ORM.

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)

Het zo gedefinieerde CustomUser model biedt alle functionaliteiten met betrekking tot gebruikersauthenticatie, terwijl je extra velden vrij kunt definiëren.

De rol van models.Manager en AbstractUserManager

In een Django model fungeert models.Manager als een interface voor het verwerken van queries naar de database. Via de standaard aangeboden objects manager kan je gemakkelijk data opvragen of manipuleren. Bijvoorbeeld, methoden zoals filter(), get(), create() zijn beschikbaar.

Wanneer de gebruikersmodel logica voor het creëren van gebruikers nodig heeft, kan AbstractUserManager worden gebruikt. AbstractUserManager erft van models.Manager en biedt methoden die zijn gespecialiseerd in het maken van gebruikers (create_user(), create_superuser()).

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        # Logica voor het creëren van een gebruiker
        pass

    def create_superuser(self, email, password=None, **extra_fields):
        # Logica voor het creëren van een superuser
        pass

Door de gebruikerscreatielogica aan te passen met CustomUserManager, kun je de gebruikersmodel flexibeler beheren.

Samenvatting: de relaties tussen modelklassen

Samenvattend zijn de relaties tussen de modelklassen in Django als volgt:

  • models.Model: de basis klasse voor alle Django-modellen. Hierdoor worden deze gelinkt aan de database en biedt het ORM functionaliteiten.
  • AbstractUser: een abstracte klasse die models.Model erft. Dit stelt ons in staat om CustomUser te definiëren.
  • AbstractUserManager: erft van models.Manager en maakt het mogelijk om de logica van gebruikerscreatie aan te passen.

Het begrijpen en toepassen van deze structuur stelt je in staat om het model systeem van Django efficiënter te ontwerpen.