Al desarrollar aplicaciones Django, una de las primeras cosas con las que nos encontramos es el modelo de base de datos básico que hereda de models.Model. Aunque muchos tutoriales nos enseñan a simplemente seguir los pasos, al profundizar un poco más en su estructura y principios, podemos aprovechar las ventajas de Django ORM de manera más efectiva. En este artículo, examinaré detalladamente cómo se estructura el sistema de modelos de Django, centrándome en la estructura de herencia de modelos de Django y en cómo definir un modelo de usuario personalizado.


models.Model: la clase base de todos los modelos

En Django, todas las clases de modelo heredan de models.Model. Esta clase models.Model es la que se encarga de mapeo con las tablas de la base de datos. Cada modelo se convierte en una tabla de base de datos, y los campos del modelo se convierten en columnas de esa tabla. Los métodos proporcionados por esta clase base son los elementos que permiten las funciones clave de Django ORM.

  • save(): guarda el objeto en la base de datos
  • delete(): elimina un objeto
  • objects.create(): crea y guarda un objeto
  • objects.filter(): consulta objetos que cumplen con ciertas condiciones

Al heredar de models.Model, se puede utilizar las funcionalidades de ORM de Django con total libertad. Esto es un ejemplo de cuán poderosamente está diseñado Django ORM.


AbstractUser y CustomUser: modelos de usuario expandibles

Django proporciona por defecto un modelo auth.User, pero es común que cada proyecto requiera expandir y personalizar su modelo de usuario. AbstractUser es el modelo de usuario abstracto que Django proporciona con esta capacidad de expansión. Por ejemplo, se utiliza cuando se desea añadir un campo de correo electrónico o más campos como número de teléfono o dirección.

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)
Estructura de herencia de modelos en Django

Definiendo CustomUser de esta manera, se pueden añadir campos personalizados manteniendo las funcionalidades de AbstractUser. Dado que AbstractUser también hereda de models.Model, se pueden utilizar todos los métodos básicos de Django ORM.


models.Manager y AbstractUserManager: lógica de creación de usuarios y consultas de base de datos

El models.Manager, que actúa como el administrador del modelo, es una interfaz que gestiona las consultas a la base de datos y permite utilizar métodos como filter(), get(), create() a través del administrador básico llamado objects. En caso de que se necesite un administrador especializado para un modelo de usuario, Django proporciona la clase AbstractUserManager. A través de esta clase, se puede personalizar la lógica relacionada con la creación de usuarios.

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        # Lógica de creación de usuarios
        pass

    def create_superuser(self, email, password=None, **extra_fields):
        # Lógica de creación de superusuarios
        pass

El uso de este tipo de administradores permite adaptar de manera flexible la creación de usuarios a diversas situaciones que puedan surgir. Dado que AbstractUserManager también hereda de models.Manager, incluye todas las funciones básicas de consultas a la base de datos.


Comprendiendo la estructura de herencia de modelos en Django

Comprender la estructura de herencia de modelos de Django permite realizar un diseño e implementación de modelos más eficientes. En resumen, esto se puede resumir como sigue:

  1. models.Model: clase base de todos los modelos de Django, que se mapea con la base de datos y proporciona funciones ORM.
  2. AbstractUser: clase abstracta que hereda de models.Model. Al heredar de esto para crear CustomUser, se puede definir fácilmente un modelo de usuario personalizado que incluya las funcionalidades de models.Model.
  3. AbstractUserManager: administrador especializado en la creación de usuarios que hereda de models.Manager. Permite personalizar fácilmente la lógica de creación de usuarios.

En conclusión, la estructura de modelos de Django está diseñada para ser muy flexible y potente. Incluso al expandir el modelo de usuario para añadir campos personalizados, comprender y utilizar las funciones y estructuras ORM proporcionadas por AbstractUser y models.Model permitirá un diseño de base de datos más eficiente y escalable. Al aprovechar bien esta estructura de modelos de Django, los desarrolladores pueden construir modelos de base de datos complejos con menos esfuerzo.