Maison développement back-end Tutoriel Python Utiliser efficacement les QuerySets de Django

Utiliser efficacement les QuerySets de Django

Apr 05, 2017 pm 03:05 PM

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")
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

. 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!")
Copier après la connexion

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!")
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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!

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

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

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Comment vérifier la version de Django Comment vérifier la version de Django Dec 01, 2023 pm 02:25 PM

É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 vs Flask : une analyse comparative des frameworks Web Python Django vs Flask : une analyse comparative des frameworks Web Python Jan 19, 2024 am 08:36 AM

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

Avantages et inconvénients du framework Django : tout ce que vous devez savoir Avantages et inconvénients du framework Django : tout ce que vous devez savoir Jan 19, 2024 am 09:09 AM

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 Comment vérifier la version de Django Nov 30, 2023 pm 03:08 PM

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 Comment mettre à niveau la version de Django : étapes et considérations Jan 19, 2024 am 10:16 AM

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-il front-end ou back-end ? Django est-il front-end ou back-end ? Nov 21, 2023 pm 02:36 PM

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.

Quelle est la différence entre les versions de Django ? Quelle est la différence entre les versions de Django ? Nov 20, 2023 pm 04:33 PM

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-il front-end ou back-end ? Vérifiez-le! Django est-il front-end ou back-end ? Vérifiez-le! Jan 19, 2024 am 08:37 AM

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.

See all articles