Rôle de models.Model

Tout d'abord, la classe de modèle la plus basique dans Django est models.Model. Tous les modèles Django sont définis en héritant de models.Model. Cette classe a pour rôle de mapper le modèle que j'ai défini à une table de base de données. Chaque classe de modèle représente une table dans la base de données, et les champs à l'intérieur deviennent les colonnes de la table.

Il est important de noter que l'héritage de models.Model offre plusieurs méthodes utiles que l'on peut utiliser par défaut :

  • save() : méthode pour enregistrer un objet dans la base de données
  • delete() : méthode pour supprimer un objet
  • objects.create() : méthode pour créer et enregistrer un nouvel objet
  • objects.filter() : méthode pour récupérer des objets satisfaisant certaines conditions

Grâce à ces fonctionnalités, on peut facilement profiter de la puissance de l'ORM Django simplement en héritant de models.Model.

Relation entre AbstractUser et CustomUser

Django dispose d'un modèle utilisateur intégré appelé auth.User. Bien qu'il soit possible de l'utiliser par défaut, il est souvent souhaitable de personnaliser le modèle utilisateur. Par exemple, il peut être nécessaire d'ajouter des champs supplémentaires comme le numéro de téléphone ou l'adresse.

Pour ce faire, on utilise AbstractUser. Cette classe est un classe abstraite conçue pour permettre l'extension du modèle utilisateur de base fourni par Django (c'est-à-dire auth.User). Étant donné que AbstractUser hérite également de models.Model, lorsque je définis CustomUser en héritant de AbstractUser, je peux utiliser toutes les fonctionnalités de l'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)

Le modèle CustomUser ainsi défini fournit toutes les fonctionnalités liées à l'authentification des utilisateurs tout en permettant de définir librement des champs supplémentaires.

Rôle de models.Manager et AbstractUserManager

Dans les modèles Django, models.Manager agit comme une interface pour traiter les requêtes sur la base de données. Grâce au gestionnaire par défaut objects, il est possible de récupérer ou de manipuler les données facilement. Par exemple, il existe des méthodes comme filter(), get(), create().

Lorsqu'un modèle utilisateur nécessite une logique de création d'utilisateurs, on peut utiliser AbstractUserManager. Ce dernier hérite de models.Manager et offre des méthodes spécialisées pour la création d'utilisateurs (create_user(), create_superuser()).

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        # Logique de création d'utilisateur
        pass

    def create_superuser(self, email, password=None, **extra_fields):
        # Logique de création de superutilisateur
        pass

En personnalisant la logique de création d'utilisateurs avec CustomUserManager, il est possible de gérer le modèle utilisateur de manière plus flexible.

Résumé : Relations entre les classes de modèles

Pour résumer les relations entre les classes de modèles dans Django, voici ce que nous avons :

  • models.Model : classe de base pour tous les modèles Django. Hérite d'elle pour mapper à la base de données et fournir des fonctionnalités ORM.
  • AbstractUser : classe abstraite héritant de models.Model. Élargie pour définir CustomUser.
  • AbstractUserManager : hérite de models.Manager pour personnaliser la logique de création d'utilisateurs.

Comprendre et utiliser cette structure permet de concevoir le système de modèles de Django de manière plus efficace.