Comment select_rated et prefetch_rated optimisent les requêtes Django ORM ?

Susan Sarandon
Libérer: 2024-10-23 22:54:29
original
354 Les gens l'ont consulté

How Do select_related and prefetch_related Optimize Django ORM Queries?

Comprendre select_rated et prefetch_rated dans Django ORM

Dans Django, select_rated et prefetch_rated sont deux techniques utilisées pour optimiser les requêtes de base de données et améliorer les performances. Ils impliquent tous deux de « rejoindre » des tables pour récupérer les données associées, mais ils le font de différentes manières.

select_rated : les jointures dans la requête SQL

select_rated effectue une JOINTURE SQL pour récupérer toutes les données associées en une seule requête. Cela donne un ensemble de résultats plus important, mais c'est plus rapide car cela élimine le besoin de requêtes supplémentaires. Il est idéal pour les relations dans lesquelles il n'y a qu'un seul ou un petit nombre d'objets associés, telles que les relations ForeignKey. en revanche, ne joint pas les tables dans la requête SQL. Au lieu de cela, il récupère uniquement les clés primaires (ID) des objets associés, puis exécute des requêtes distinctes pour récupérer les données réelles en Python. Cela conduit à des requêtes SQL plus petites, mais nécessite des requêtes supplémentaires. Il convient aux relations où il existe un grand nombre d'objets associés, tels que ManyToManyFields ou Reverse ForeignKeys.

Différences dans la représentation Python

Une autre différence clé réside dans le Représentation Python des objets associés. Avec select_rated, des objets en double sont créés en Python pour chaque objet associé. En revanche, prefetch_rated utilise un seul objet pour représenter chaque objet associé, ce qui peut économiser de la mémoire.

Directives d'utilisation

En règle générale, utilisez select_rated pour les relations dans lesquelles vous récupérera un petit nombre d’objets associés. Pour les relations avec un grand nombre d'objets associés, utilisez prefetch_rated.

Exemple

Considérez les modèles Django suivants :

Pour récupérer tous livres avec leurs auteurs et éditeurs respectifs à l'aide de select_rated :

Pour récupérer tous les auteurs avec leurs livres respectifs à l'aide de prefetch_rated :

<code class="python">class Publisher(models.Model):
    name = models.CharField(max_length=255)

class Author(models.Model):
    name = models.CharField(max_length=255)
    publisher = models.ForeignKey(Publisher)

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(Author)</code>
Copier après la connexion

Dans l'exemple prefetch_rated, les objets Book ne sont pas immédiatement disponible sur les objets Auteur. Au lieu de cela, author.book_set doit être explicitement accessible pour récupérer les livres.

<code class="python">books = Book.objects.select_related('author', 'author__publisher').all()</code>
Copier après la connexion
N'oubliez pas que la meilleure approche pour votre projet dépendra des exigences spécifiques et des caractéristiques des données. Il est recommandé d'expérimenter les deux techniques pour déterminer laquelle donne les performances optimales.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!