Utiliser efficacement les QuerySets de Django
Le mappage objet-relationnel (ORM) simplifie l'interaction avec les bases de données SQL, mais il est également considéré comme inefficace et plus lent que le SQL brut.
Utiliser efficacement un ORM signifie comprendre comment il interroge la base de données. Dans cet article, je me concentrerai sur la façon d'utiliser efficacement le système Django ORM pour accéder à des ensembles de données de taille moyenne à grande.
L'ensemble de requêtes de Django est paresseux
Le jeu de requêtes de Django correspond à plusieurs enregistrements (lignes) de la base de données, filtrés via des requêtes facultatives. Par exemple, le code suivant obtiendra toutes les personnes nommées « Dave » dans la base de données :
person_set = Person.objects.filter(first_name="Dave")
Le code ci-dessus n'exécute aucune requête de base de données. Vous pouvez utiliser person_set, y ajouter des conditions de filtre ou le transmettre à une fonction, et ces opérations ne seront pas envoyées à la base de données. C'est exact car les requêtes de base de données sont l'un des facteurs qui affectent de manière significative les performances des applications Web.
Pour obtenir réellement des données de la base de données, vous devez parcourir l'ensemble de requêtes :
for person in person_set: print(person.last_name)
L'ensemble de requêtes de Django a un cache
Lorsque vous parcourez un ensemble de requêtes, tous les enregistrements correspondants sont récupérés de la base de données et convertis en modèle Django. C’est ce qu’on appelle l’évaluation. Ces modèles seront enregistrés dans le cache intégré de l'ensemble de requêtes, de sorte que si vous parcourez à nouveau l'ensemble de requêtes, vous n'aurez pas besoin d'exécuter à nouveau la même requête générale.
Par exemple, le code suivant n'exécutera une requête de base de données qu'une seule fois :
pet_set = Pet.objects.filter(species="Dog") # The query is executed and cached. for pet in pet_set: print(pet.first_name) # The cache is used for subsequent iteration. for pet in pet_set: print(pet.last_name)
L'instruction if déclenchera l'exécution du jeu de requêtes
La chose la plus utile à propos du cache de l'ensemble de requêtes est qu'il peut tester efficacement si l'ensemble de requêtes contient des données. Il ne sera parcouru que lorsqu'il y a des données :
restaurant_set = Restaurant.objects.filter(cuisine="Indian") # `if`语句会触发queryset的执行。 if restaurant_set: # 遍历时用的是cache中的数据 for restaurant in restaurant_set: print(restaurant.name)
. Si vous n'avez pas besoin de toutes les données, le cache de l'ensemble de requêtes peut poser problème
Parfois, vous souhaiterez peut-être simplement savoir si des données existent sans parcourir toutes les données. Dans ce cas, le simple fait d'utiliser une instruction if pour porter un jugement exécutera complètement l'ensemble de requêtes et mettra les données dans le cache, même si vous n'avez pas besoin des données !
city_set = City.objects.filter(name="Cambridge") # `if`语句会执行queryset.。 if city_set: # 我们并不需要所有的数据,但是ORM仍然会获取所有记录! print("At least one city called Cambridge still stands!")
Pour éviter cela, vous pouvez utiliser la méthode exist() pour vérifier s'il y a des données :
tree_set = Tree.objects.filter(type="deciduous") # `exists()`的检查可以避免数据放入queryset的cache。 if tree_set.exists(): # 没有数据从数据库获取,从而节省了带宽和内存 print("There are still hardwood trees in the world!")
Lorsque l'ensemble de requêtes est très volumineux, le cache deviendra un problème
Lors du traitement de milliers d’enregistrements, les charger en mémoire d’un seul coup est un gaspillage. Ce qui est pire, c'est qu'un énorme ensemble de requêtes peut verrouiller le processus système et amener votre programme au bord du crash.
Pour éviter de générer le cache de l'ensemble de requêtes lors du parcours des données, vous pouvez utiliser la méthode iterator() pour obtenir les données et les supprimer après leur traitement.
star_set = Star.objects.all() # `iterator()`可以一次只从数据库获取少量数据,这样可以节省内存 for star in star_set.iterator(): print(star.name)
Bien entendu, l'utilisation de la méthode iterator() pour empêcher la génération de cache signifie que les requêtes seront exécutées à plusieurs reprises lors du parcours du même ensemble de requêtes. Soyez donc prudent lorsque vous utilisez iterator() et assurez-vous que votre code n'exécute pas de requêtes à plusieurs reprises lorsque vous travaillez sur un grand ensemble de requêtes
Si l'ensemble de requêtes est volumineux, l'instruction if pose problème
Comme mentionné précédemment, le cache de l'ensemble de requêtes est puissant pour combiner les instructions if et for, ce qui permet des boucles conditionnelles sur un ensemble de requêtes. Toutefois, pour les ensembles de requêtes très volumineux, la mise en cache des ensembles de requêtes n’est pas adaptée.
La solution la plus simple consiste à utiliser exist() conjointement avec iterator() pour éviter d'utiliser le cache de l'ensemble de requêtes en utilisant deux requêtes de base de données.
molecule_set = Molecule.objects.all() # One database query to test if any rows exist. if molecule_set.exists(): # Another database query to start fetching the rows in batches. for molecule in molecule_set.iterator(): print(molecule.velocity)
Une solution plus compliquée consiste à utiliser la « méthode d'itération avancée » de Python pour examiner le premier élément de iterator() avant de démarrer la boucle, puis de décider s'il faut boucler.
atom_set = Atom.objects.all() # One database query to start fetching the rows in batches. atom_iterator = atom_set.iterator() # Peek at the first item in the iterator. try: first_atom = next(atom_iterator) except StopIteration: # No rows were found, so do nothing. pass else: # At least one row was found, so iterate over # all the rows, including the first one. from itertools import chain for atom in chain([first_atom], atom_set): print(atom.mass)
Empêcher une optimisation inappropriée
Le cache de Queryset est utilisé pour réduire les requêtes du programme sur la base de données. Dans des conditions normales d'utilisation, il garantira que la base de données ne sera interrogée qu'en cas de besoin.
Utilisez les méthodes exist() et iterator() pour optimiser l'utilisation de la mémoire par le programme. Cependant, comme ils ne génèrent pas de cache d'ensemble de requêtes, ils peuvent provoquer des requêtes de base de données supplémentaires.
Vous devez donc faire attention lors du codage. Si le programme commence à ralentir, vous devez voir où se trouvent les goulots d'étranglement dans le code et s'il existe de petites optimisations qui peuvent vous aider.
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds

Étapes pour vérifier la version de Django : 1. Ouvrez un terminal ou une fenêtre d'invite de commande ; 2. Assurez-vous que Django n'est pas installé, vous pouvez utiliser l'outil de gestion de packages pour l'installer et entrer la commande pip install django 3 ; . Une fois l'installation terminée, vous pouvez utiliser python -m django --version pour vérifier la version de Django.

Django et Flask sont tous deux leaders dans les frameworks Web Python, et ils ont tous deux leurs propres avantages et scénarios applicables. Cet article procédera à une analyse comparative de ces deux frameworks et fournira des exemples de code spécifiques. Introduction au développement Django est un framework Web complet, son objectif principal est de développer rapidement des applications Web complexes. Django fournit de nombreuses fonctions intégrées, telles que ORM (Object Relational Mapping), formulaires, authentification, backend de gestion, etc. Ces fonctionnalités permettent à Django de gérer de grandes

Django est un framework de développement complet qui couvre tous les aspects du cycle de vie du développement Web. Actuellement, ce framework est l’un des frameworks Web les plus populaires au monde. Si vous envisagez d'utiliser Django pour créer vos propres applications Web, vous devez alors comprendre les avantages et les inconvénients du framework Django. Voici tout ce que vous devez savoir, y compris des exemples de code spécifiques. Avantages de Django : 1. Développement rapide : Djang peut développer rapidement des applications Web. Il fournit une bibliothèque riche et interne

Comment vérifier la version de Django : 1. Pour vérifier via la ligne de commande, entrez la commande "python -m django --version" dans la fenêtre du terminal ou de la ligne de commande. 2. Pour vérifier dans l'environnement interactif Python, entrez "import django ; print(django. get_version())" code ; 3. Vérifiez le fichier de paramètres du projet Django et recherchez une liste nommée INSTALLED_APPS, qui contient des informations sur les applications installées.

Comment mettre à niveau la version de Django : étapes et considérations, exemples de code spécifiques requis Introduction : Django est un puissant framework Web Python qui est continuellement mis à jour et mis à niveau pour offrir de meilleures performances et plus de fonctionnalités. Cependant, pour les développeurs utilisant des versions plus anciennes de Django, la mise à niveau de Django peut rencontrer certains défis. Cet article présentera les étapes et les précautions à suivre pour mettre à niveau la version de Django et fournira des exemples de code spécifiques. 1. Sauvegardez les fichiers du projet avant de mettre à niveau Djan

Django est le back-end. Détails : Bien que Django soit avant tout un framework backend, il est étroitement lié au développement front-end. Grâce à des fonctionnalités telles que le moteur de modèles de Django, la gestion de fichiers statiques et l'API RESTful, les développeurs front-end peuvent collaborer avec les développeurs back-end pour créer des applications Web puissantes et évolutives.

Les différences sont : 1. Série Django 1.x : Il s'agit d'une première version de Django, comprenant les versions 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8 et 1.9. Ces versions fournissent principalement des fonctions de développement Web de base ; 2. Série Django 2.x : Il s'agit de la version intermédiaire de Django, comprenant les versions 2.0, 2.1, 2.2 et autres. 3. Série Django 3.x : Il s'agit de la dernière version ; série de Django, y compris les versions 3.0, 3, etc.

Django est un framework d'application Web écrit en Python qui met l'accent sur un développement rapide et des méthodes propres. Bien que Django soit un framework Web, pour répondre à la question de savoir si Django est un front-end ou un back-end, vous devez avoir une compréhension approfondie des concepts de front-end et de back-end. Le front-end fait référence à l'interface avec laquelle les utilisateurs interagissent directement, et le back-end fait référence aux programmes côté serveur. Ils interagissent avec les données via le protocole HTTP. Lorsque le front-end et le back-end sont séparés, les programmes front-end et back-end peuvent être développés indépendamment pour mettre en œuvre respectivement la logique métier et les effets interactifs, ainsi que l'échange de données.
