reverse search and related name (Django)

reverse search and related name (Django)

El reverse search y el related name son dos conceptos que me tocó aprender dándome de bruces contra la pared.

Reverse search:

La búsqueda reversa se refiere a la capacidad de Django de permitirte acceder a las instancias de un modelo a través de su relación con otro modelo. Esto es útil cuando tienes relaciones de uno a mucho o de muchos a muchos.

Related name:

Es un atributo que se utiliza en los campos de relaciones como: ForeignKey, OneToOneField, ManyToManyField para especificar el nombre del atributo que Django creará en el modelo relacionado para acceder a esta relación en sentido inverso.

¿Qué significa todo esto?

Que podrás hacer una búsqueda reversa si tienes un related name definido. Veamos un ejemplo:

from django.db import models

class Autor(models.Model):
    name = models.CharField(max_length=100)
    
    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=100)
    autor = models.ForeignKey(Autor, on_delete=models.CASCADE, related_name='books')
    
    def __str__(self):
        return self.title

Si tienes dos modelos: Autor y Book. Un autor puede tener múltiples libros (relación de uno a muchos).

Si no le asignas un nombre, Django creará uno con el prefijo del modelo y el sufijo "_set", es decir, "book_set".

Con el related_name podrás acceder a los libros de un autor por medio de la búsqueda reversa.

¿Para qué sirve?

  • Legibilidad: Hace que el código sea más intuitivo y fácil de leer.
  • Evita conflictos de nombres: Si hay múltiples relaciones con el mismo modelo, related_name permite especificar nombres únicos para cada relación inversa.
  • Organización del código: Facilita la organización y el acceso a los datos relacionados.

En una línea: related_name permite definir nombres personalizados para acceder a relaciones inversas en los modelos.