
Django select_related() vs prefetch_related(): SQL generado
¿select_related() o prefetch_related()? Ambos métodos eliminan consultas N+1 en Django, pero no generan en absoluto el mismo SQL. El primero añade un join a la consulta principal. El segundo ejecuta varias consultas y después relaciona los objetos en Python. La elección correcta depende menos del volumen de datos que del tipo de relación recorrida. Para entenderlo, partamos de un modelo deliberadamente sencillo: from django.conf import settings from django.db import models class Post(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="posts", ) tags = models.ManyToManyField("Tag", related_name="posts") class Comment(models.Model): post = models.ForeignKey( Post, on_delete=models.CASCADE, related_name="comments", ) body = models.TextField() is_public = models.BooleanField(default=True) author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) class Tag(models.Model): name = models.CharField(max_length=50) Desde un Post, author designa como máximo a un usuario. En cambio, comments y tags pueden contener varios objetos. Esta diferencia de cardinalidad dicta casi siempre qué método utilizar. ...






