En Django ORM, los métodos select_ related y prefetch_ related tienen distintos propósitos para gestionar relaciones en consultas de bases de datos.
select_ related
El método select_ related de Django recupera datos relacionados modelar datos durante una consulta de base de datos mediante la realización de uniones SQL. Recupera eficientemente los campos seleccionados de los modelos relacionados, minimizando la necesidad de consultas posteriores. Este enfoque es particularmente adecuado para relaciones que involucran claves externas o conexiones OneToOneField.
prefetch_ related
A diferencia de select_ related, prefetch_ related no realiza uniones SQL. En cambio, ejecuta consultas separadas para recuperar modelos relacionados. Luego, los datos se "unen" en Python. Este método es beneficioso para relaciones que involucran ManyToManyFields o conexiones de clave externa inversa.
Ejemplo
Considere la siguiente configuración del modelo:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author)
Para buscar un autor con sus libros relacionados usando select_ related:
author = Author.objects.select_related('book_set').get(pk=1)
for book in author.book_set.all():
print(book.title)
Para buscar un autor con sus libros relacionados usando prefetch_ related:
authors = Author.objects.prefetch_related('book_set').all()
for author in authors:
for book in author.book_set.all():
print(book.title)
Si bien ambos métodos recuperan datos relacionados, select_ related es óptimo para relaciones de un solo objeto con columnas redundantes limitadas. Por el contrario, se prefiere prefetch_ related para relaciones de muchos a muchos o relaciones escasas de clave externa inversa para minimizar la comunicación de la base de datos. Sin embargo, puede dar lugar a objetos duplicados en la representación de los datos en Python.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3