Rol de models.Model

Primero, la clase de modelo más básica en Django es models.Model. Todos los modelos de Django se definen heredando de models.Model. Esta clase se encarga de mapear el modelo que defino a una tabla de base de datos. Cada clase de modelo se convierte en una tabla de la base de datos y los campos dentro de ella se convierten en columnas.

Un punto importante es que al heredar de models.Model, se ofrecen varios métodos útiles que se pueden utilizar por defecto:

  • save(): método para guardar un objeto en la base de datos
  • delete(): método para eliminar un objeto
  • objects.create(): método para crear y guardar un nuevo objeto
  • objects.filter(): método para consultar objetos que cumplen con condiciones específicas

Gracias a estas funcionalidades, al solamente heredar de models.Model, se puede utilizar fácilmente el poderoso ORM de Django.

Relación entre AbstractUser y CustomUser

Django tiene un modelo de usuario incorporado llamado auth.User. Se puede utilizar este modelo de manera predeterminada, pero en la mayoría de los casos, se desea personalizar el modelo de usuario. Por ejemplo, puede haber momentos en que se deseen agregar campos adicionales como número de teléfono o dirección.

En este caso, se utiliza AbstractUser. Esta clase es una clase abstracta diseñada para permitir la extensión del modelo de usuario que Django proporciona por defecto (es decir, auth.User). Dado que AbstractUser también hereda de models.Model, al heredar de AbstractUser para definir CustomUser, se pueden utilizar todas las funcionalidades del 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)

El modelo CustomUser definido de esta manera ofrece todas las funcionalidades relacionadas con la autenticación de usuarios mientras permite definir libremente campos adicionales.

Rol de models.Manager y AbstractUserManager

En el modelo de Django, models.Manager actúa como una interfaz que maneja las consultas a la base de datos. A través del administrador objects proporcionado por defecto, se puede consultar o manipular datos fácilmente. Por ejemplo, hay métodos como filter(), get(), create().

El modelo de usuario puede utilizar AbstractUserManager cuando necesita lógica para crear usuarios. AbstractUserManager hereda de models.Manager y proporciona métodos especializados para la creación de usuarios (create_user(), create_superuser()).

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        # Lógica para crear un usuario
        pass

    def create_superuser(self, email, password=None, **extra_fields):
        # Lógica para crear un superusuario
        pass

Al personalizar la lógica de creación de usuarios implementando CustomUserManager, se puede gestionar el modelo de usuario de manera más flexible.

Resumen: Relaciones entre las clases de modelo

Hasta ahora, si resumimos las relaciones entre las clases de modelo de Django, tenemos lo siguiente:

  • models.Model: clase base para todos los modelos de Django. Al heredar de ella, se mapea con la base de datos y se brinda funcionalidad de ORM.
  • AbstractUser: clase abstracta que hereda de models.Model. Se expande para definir CustomUser.
  • AbstractUserManager: hereda de models.Manager y permite personalizar la lógica de creación de usuarios.

Comprender y aprovechar esta estructura permite diseñar el sistema de modelos de Django de manera más eficiente.