recherche
Maisondéveloppement back-endTutoriel PythonErreurs courantes de Django ORM à corriger

Common Django ORM Mistakes to fix

Django ORM est l'une des fonctionnalités les plus puissantes de Django. Il élimine une grande partie de la complexité de l'interaction avec les bases de données, permettant aux développeurs de manipuler les données avec la syntaxe Pythonic plutôt qu'avec du SQL brut. Toutes ces fonctions ORM génèrent des requêtes SQL qui peuvent devenir un goulot d'étranglement si elles ne sont pas traitées avec soin.
Ce blog met en évidence les erreurs courantes lors de l'utilisation de Django ORM et propose également des conseils pour que les requêtes restent efficaces, maintenables et performantes.

1. Le problème de requête N 1

Le problème de requête N 1 se produit lorsque votre code déclenche une requête pour récupérer un ensemble d'enregistrements, puis exécute à nouveau N requêtes supplémentaires pour récupérer les données associées.

blogs = Blog.objects.all()    # 1 Query
for blog in blogs:
    print(blog.author.name)   # N additional queries

Dans l'exemple ci-dessus, l'accès à blog.author.name à l'intérieur de la boucle amène Django à récupérer l'enregistrement de l'auteur pour chaque blog individuellement, conduisant à N requêtes supplémentaires.

Comment y remédier
Utilisez select_rated pour des objets associés uniques (par exemple, ForeignKey ou OneToOneField), car il effectue une JOINTURE SQL pour récupérer l'objet principal et ses objets associés en une seule requête. Pour les relations plusieurs-à-plusieurs, plusieurs-à-un ou inverses, utilisez prefetch_rated, qui récupère les données associées dans des requêtes distinctes mais les combine efficacement en Python, évitant ainsi le problème N 1.

# With select_related
blogs = Blog.objects.select_related('author').all()

# With prefetch_related
authors = Author.objects.prefetch_related('blogs').all()

2. Surutilisation de .all() et .filter()

Les développeurs enchaînent souvent plusieurs filtres ou utilisent .all() suivi de requêtes répétées sur le même ensemble de requêtes :

blogs = Blog.objects.all()
active_blogs = blogs.filter(is_archived=False)
popular_blogs = blogs.filter(views__gte=1000)

Bien que Django essaie d'optimiser les ensembles de requêtes en les évaluant paresseusement uniquement lorsque cela est nécessaire, l'appel répété de filtres sur les mêmes données d'ensemble de requêtes peut toujours provoquer des accès inutiles à la base de données.

Comment y remédier
La combinaison de filtres dans une seule instruction permet à Django de générer une seule requête SQL.

popular_active_blogs = Blog.objects.filter(is_archived=False, views__gte=1000)

3. Ne pas profiter de Values() ou de Values_list()

Parfois, nous n'avons besoin que de champs spécifiques plutôt que de toutes les données de champ du modèle. Pendant cela, l'utilisation de .values() ou .values_list() peut être plus efficace.

titles = Blog.objects.values('title')
or
titles = Blog.objects.values_list('title', flat=True)
# values() returns a list of dictionaries.
# values_list() can return tuples or flat values if flat=True is provided.

En récupérant uniquement les colonnes nécessaires, vous réduisez la quantité de données transférées depuis la base de données, améliorant ainsi les performances.

4. Agrégations et annotations inefficaces

Appeler à plusieurs reprises .aggregate() ou .annotate() peut provoquer plusieurs requêtes. Les requêtes complexes avec plusieurs annotations peuvent conduire à des requêtes SQL inefficaces, ce qui peut entraîner des opérations de base de données lourdes.

# Example of multiple aggregate
total_count = Blog.objects.aggregate(Count('id'))
author_count = Blog.objects.aggregate(Count('author'))
average_views = Blog.objects.aggregate(Avg('views'))

Recommandation

blogs = Blog.objects.all()    # 1 Query
for blog in blogs:
    print(blog.author.name)   # N additional queries

5. Ne pas utiliser les index de base de données

L'indexation améliore les performances des requêtes en permettant à la base de données de localiser et de récupérer rapidement les données, évitant ainsi les analyses lentes de tables complètes. Les index optimisent les opérations telles que le filtrage, le tri et la jointure, rendant ainsi les requêtes sur les champs fréquemment consultés beaucoup plus rapides. Un index de base de données manquant sur les champs fréquemment interrogés peut réduire considérablement les performances.
Comment ajouter des index dans Django

# With select_related
blogs = Blog.objects.select_related('author').all()

# With prefetch_related
authors = Author.objects.prefetch_related('blogs').all()

Les index peuvent accélérer la lecture mais ralentir la vitesse d'écriture. Ainsi, n'indexez que les champs que vous devez souvent interroger.

6. Ne pas utiliser la mise en cache

Utilisez la mise en cache lorsque nous devons interroger des données coûteuses à calculer ou qui changent rarement. La mise en cache, même pendant 5 minutes, peut enregistrer des requêtes répétées, des calculs complexes et des requêtes rarement modifiées.

blogs = Blog.objects.all()
active_blogs = blogs.filter(is_archived=False)
popular_blogs = blogs.filter(views__gte=1000)

7. SQL brut

Parfois, l'ORM Django ne peut pas exprimer efficacement une requête complexe ou une opération groupée. Bien que Django propose .extra() ou .raw(), l'utilisation de SQL brut doit être un dernier recours car :

  • Perd de nombreux avantages de l'ORM
  • Peut conduire à un code illisible ou sujet aux erreurs

S'assurer que les entrées sont correctement nettoyées et que les requêtes SQL brutes restent maintenables.

En appliquant ces conseils, vous améliorerez les performances de votre application Django tout en gardant le code propre et maintenable. Et également suggéré d'utiliser la Django Debug Toolbar dans votre environnement de développement pour surveiller et analyser le nombre de requêtes exécutées, leur temps d'exécution et les instructions SQL.

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!

Déclaration
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
Comment coupez-vous une liste de python?Comment coupez-vous une liste de python?May 02, 2025 am 12:14 AM

SlitingyPapyThonListIsDoneUsingTheSyntaxList [Démarrage: arrêt: étape] .He'showitworks: 1) startisheindexofthefirStelementoinclude.2) stopisTheIndexoftheFirstelementsoexclude.3) StepistheincrementBetweenselans.it'susefulfactingPortationSoListShsandCanusegeg

Quelles sont les opérations communes qui peuvent être effectuées sur des tableaux Numpy?Quelles sont les opérations communes qui peuvent être effectuées sur des tableaux Numpy?May 02, 2025 am 12:09 AM

NumpyAllowsForvariousOperations ONARRAYS: 1) BasicarithmeticLikeaddition, Soustraction, Multiplication, anddivision; 2) AdvancedOperationSuchasmatrixMultiplication; 3) Element-Wiseoperations withoutExplicitloop

Comment les tableaux sont-ils utilisés dans l'analyse des données avec Python?Comment les tableaux sont-ils utilisés dans l'analyse des données avec Python?May 02, 2025 am 12:09 AM

ArraySinpython, en particulier ThroughNumpyandPandas, aressentialfordataanalysis, offingspeeedAfficiency.1) numpyarrayablefficienthandlingoflargedatasetsandComplexOperationsLikEMoVingAverages.2)

Comment l'empreinte mémoire d'une liste se compare-t-elle à l'empreinte de la mémoire d'un tableau dans Python?Comment l'empreinte mémoire d'une liste se compare-t-elle à l'empreinte de la mémoire d'un tableau dans Python?May 02, 2025 am 12:08 AM

ListsandNumpyArraysInpythonHaveDidifferentMemoryfootprints: listsaRemoreFlexibles Butlessmemory économe, tandis que la liste de résensés est-ce qui

Comment gérez-vous les configurations spécifiques à l'environnement lors du déploiement de scripts Python exécutables?Comment gérez-vous les configurations spécifiques à l'environnement lors du déploiement de scripts Python exécutables?May 02, 2025 am 12:07 AM

ToenSurepythonscriptsBeHavecorrectlyAcrossDevelopment, mise en scène et production, catégories de type: 1) EnvironmentVariblesForsImplesettings, 2) ConfigurationFilesForComplexsetups et3) dynamicloadingforadaptability.eachMethodoffersNebeneFitsAndreCeresca

Comment trancher un tableau Python?Comment trancher un tableau Python?May 01, 2025 am 12:18 AM

La syntaxe de base pour le découpage de la liste Python est la liste [Démarrage: arrêt: étape]. 1.Start est le premier index d'élément inclus, 2.STOP est le premier indice d'élément exclu et 3.StEP détermine la taille de l'étape entre les éléments. Les tranches sont non seulement utilisées pour extraire les données, mais aussi pour modifier et inverser les listes.

Dans quelles circonstances les listes pourraient-elles mieux fonctionner que les tableaux?Dans quelles circonstances les listes pourraient-elles mieux fonctionner que les tableaux?May 01, 2025 am 12:06 AM

ListesoutPerformarRaySin: 1) dynamicingizingandfrequentinSertions / Deletions, 2) StoringheteroGeneousData, and3) MemoryEfficiencyForsparsedata, butmayhaveslightperformanceCostSincertorations.

Comment pouvez-vous convertir un tableau Python en une liste Python?Comment pouvez-vous convertir un tableau Python en une liste Python?May 01, 2025 am 12:05 AM

Toconvertapythonarraytoalist, usethelist () Constructororageneratorexpression.1) ImportTheArrayModuleandCreateArray.2) Uselist (Arr) ou [Xforxinarr] à Convertittoalist, considérant la performance et le domaine de l'émie-efficacité pour les étages.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Listes Sec

Listes Sec

SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel