Quand utiliser select_rated ou prefetch_rated de Django ORM ?

Susan Sarandon
Libérer: 2024-10-23 17:52:12
original
523 Les gens l'ont consulté

When to Use Django ORM's select_related vs. prefetch_related?

La distinction entre select_rated et prefetch_rated de Django ORM

Dans Django ORM, les méthodes select_rated et prefetch_rated servent des objectifs distincts pour la gestion des relations dans les requêtes de base de données.

select_rated

La méthode select_rated de Django récupère les données de modèle associées lors d'une requête de base de données en effectuant des jointures SQL. Il récupère efficacement les champs sélectionnés des modèles associés, minimisant ainsi le besoin de requêtes ultérieures. Cette approche est particulièrement adaptée aux relations impliquant des connexions de clé étrangère ou OneToOneField.

prefetch_rated

Contrairement à select_rated, prefetch_rated n'effectue pas de jointures SQL. Au lieu de cela, il exécute des requêtes distinctes pour récupérer les modèles associés. Les données sont ensuite « jointes » en Python. Cette méthode est bénéfique pour les relations impliquant ManyToManyFields ou des connexions de clé étrangère inversées.

Exemple

Considérez la configuration de modèle suivante :

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

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

Pour récupérer un auteur avec ses livres associés à l'aide de select_rated :

<code class="python">author = Author.objects.select_related('book_set').get(pk=1)
for book in author.book_set.all():
    print(book.title)</code>
Copier après la connexion

Pour récupérer un auteur avec ses livres associés à l'aide de prefetch_rated :

<code class="python">authors = Author.objects.prefetch_related('book_set').all()
for author in authors:
    for book in author.book_set.all():
        print(book.title)</code>
Copier après la connexion

Bien que les deux méthodes récupèrent des données associées, select_rated est optimal pour un seul -relations d'objet avec des colonnes redondantes limitées. En revanche, prefetch_rated est préféré pour les relations plusieurs-à-plusieurs ou les relations de clé étrangère inversée clairsemées afin de minimiser la communication avec la base de données. Cependant, cela peut entraîner des objets en double dans la représentation Python des données.

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!