Lorsque nous développons une application Django, l'un des premiers éléments que nous rencontrons est le modèle de base de données qui hérite de models.Model. Bien que de nombreux tutoriels se contentent de suivre des instructions, approfondir la structure et les principes nous permet de tirer encore plus profit des avantages de Django ORM. Cet article se concentre sur la structure d'héritage des modèles Django et la façon de définir un modèle d'utilisateur personnalisé, afin d'explorer en détail comment le système de modèles de Django est construit.


models.Model : La classe de base de tous les modèles

Dans Django, toutes les classes de modèle héritent de models.Model. Cette classe models.Model joue le rôle de mappage avec les tables de la base de données. Chaque modèle devient une table de base de données, et les champs du modèle deviennent les colonnes de la table. Les méthodes fournies par cette classe de base permettent d'activer les fonctionnalités clés de Django ORM.

  • save() : Enregistrer l'objet dans la base de données
  • delete() : Supprimer l'objet
  • objects.create() : Créer et enregistrer un objet
  • objects.filter() : Récupérer des objets satisfaisant des conditions

Rien qu'en héritant de models.Model, nous pouvons utiliser librement les fonctionnalités ORM de Django. C'est un exemple révélateur de la puissance de conception de Django ORM.


AbstractUser et CustomUser : Modèle utilisateur extensible

Django fournit par défaut le modèle auth.User, mais il est courant d'avoir besoin d'étendre et de personnaliser le modèle utilisateur selon les projets. AbstractUser est le modèle utilisateur abstrait fourni par Django en tenant compte de cette extensibilité. Par exemple, lorsque nous souhaitons ajouter un champ d'email, de numéro de téléphone ou d'adresse, nous l'utilisons.

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)
Structure d'héritage des modèles Django

En définissant CustomUser de cette manière, nous pouvons ajouter des champs personnalisés tout en conservant les fonctionnalités d'AbstractUser. Étant donné que AbstractUser hérite également de models.Model, nous avons accès aux méthodes de base de Django ORM.


models.Manager et AbstractUserManager : Logique des requêtes de base de données et création d'utilisateurs

Le models.Manager, qui joue le rôle de gestionnaire de modèle, est une interface qui gère les requêtes vers la base de données, permettant d'utiliser des méthodes telles que filter(), get(), create() via le gestionnaire par défaut objects. Dans les cas où un gestionnaire spécialisé pour le modèle utilisateur, comme CustomUser, est nécessaire, Django fournit la classe de gestionnaire AbstractUserManager. Cette classe permet de personnaliser la logique de création d'utilisateurs.

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 utilisant un gestionnaire de ce type, il est possible de s'adapter de manière flexible aux différentes situations pouvant survenir lors du processus de création d'un utilisateur. Étant donné qu'AbstractUserManager est également hérité de models.Manager, il inclut toutes les fonctionnalités de requêtes de base de données standard.


Comprendre la structure d'héritage des modèles Django

Comprendre la structure d'héritage des modèles dans Django permet de concevoir et de mettre en œuvre des modèles de manière plus efficace. En résumé, cela se présente comme suit :

  1. models.Model : Classe de base de tous les modèles Django, qui fournit des fonctionnalités ORM tout en étant mappée à la base de données.
  2. AbstractUser : Classe abstraite héritant de models.Model. En l'héritant, nous pouvons définir facilement un modèle utilisateur personnalisé CustomUser qui inclut les fonctionnalités de models.Model.
  3. AbstractUserManager : Gestionnaire spécialisé pour la création d'utilisateurs qui hérite de models.Manager. Il permet de personnaliser facilement la logique de création d'utilisateurs.

En conclusion, la structure des modèles de Django est conçue pour être à la fois flexible et puissante. Même lors de l'extension du modèle utilisateur pour ajouter des champs personnalisés, comprendre et exploiter les fonctionnalités ORM et la structure fournies par AbstractUser et models.Model permet d'obtenir un design de base de données plus efficace et extensible. En utilisant bien cette structure des modèles, les développeurs peuvent construire des modèles de base de données complexes avec moins d'effort.