Heim Backend-Entwicklung Python-Tutorial Djangos QuerySets effektiv nutzen

Djangos QuerySets effektiv nutzen

Apr 05, 2017 pm 03:05 PM

Die objektrelationale Zuordnung (ORM) vereinfacht die Interaktion mit SQL-Datenbanken, gilt jedoch auch als ineffizient und langsamer als reines SQL.

Um ein ORM effektiv nutzen zu können, muss man verstehen, wie es die Datenbank abfragt. In diesem Artikel werde ich mich darauf konzentrieren, wie man das Django ORM-System effektiv nutzt, um auf mittlere bis große Datensätze zuzugreifen.

Djangos Abfragesatz ist faul

Djangos Abfragesatz entspricht mehreren Datensätzen (Zeilen) in der Datenbank, gefiltert durch optionale Abfragen. Mit dem folgenden Code werden beispielsweise alle Personen mit dem Namen „Dave“ in der Datenbank abgerufen:

person_set = Person.objects.filter(first_name="Dave")
Nach dem Login kopieren

Der obige Code führt keine Datenbankabfragen aus. Sie können person_set verwenden, einige Filterbedingungen hinzufügen oder es an eine Funktion übergeben, und diese Vorgänge werden nicht an die Datenbank gesendet. Dies ist richtig, da Datenbankabfragen einer der Faktoren sind, die die Leistung von Webanwendungen erheblich beeinflussen.

Um tatsächlich Daten aus der Datenbank zu erhalten, müssen Sie queryset durchlaufen:

for person in person_set:
    print(person.last_name)
Nach dem Login kopieren

Djangos Abfragesatz verfügt über einen Cache

Wenn Sie einen Abfragesatz durchlaufen, werden alle übereinstimmenden Datensätze aus der Datenbank abgerufen und in ein Django-Modell konvertiert. Dies nennt man Bewertung. Diese Modelle werden im integrierten Cache des Abfragesatzes gespeichert, sodass Sie bei einer erneuten Iteration durch den Abfragesatz nicht dieselbe allgemeine Abfrage erneut ausführen müssen.

Der folgende Code führt beispielsweise eine Datenbankabfrage nur einmal aus:

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)
Nach dem Login kopieren

Die if-Anweisung löst die Ausführung von queryset

aus Das Nützlichste am Abfragesatz-Cache ist, dass er effektiv testen kann, ob der Abfragesatz Daten enthält. Er wird nur durchlaufen, wenn Daten vorhanden sind:

restaurant_set = Restaurant.objects.filter(cuisine="Indian")
# `if`语句会触发queryset的执行。
if restaurant_set:
    # 遍历时用的是cache中的数据
    for restaurant in restaurant_set:
        print(restaurant.name)
Nach dem Login kopieren

Wenn Sie nicht alle Daten benötigen, kann der Queryset-Cache ein Problem sein

Manchmal möchten Sie vielleicht nur wissen, ob Daten vorhanden sind, ohne alle Daten zu durchlaufen. In diesem Fall führt die einfache Verwendung einer if-Anweisung zur Beurteilung dazu, dass der gesamte Abfragesatz vollständig ausgeführt und die Daten in den Cache gestellt werden, auch wenn Sie die Daten nicht benötigen!

city_set = City.objects.filter(name="Cambridge")
# `if`语句会执行queryset.。
if city_set:
    # 我们并不需要所有的数据,但是ORM仍然会获取所有记录!
    print("At least one city called Cambridge still stands!")
Nach dem Login kopieren

Um dies zu vermeiden, können Sie mit der Methode exist() prüfen, ob Daten vorhanden sind:

tree_set = Tree.objects.filter(type="deciduous")
# `exists()`的检查可以避免数据放入queryset的cache。
if tree_set.exists():
    # 没有数据从数据库获取,从而节省了带宽和内存
    print("There are still hardwood trees in the world!")
Nach dem Login kopieren

Wenn der Abfragesatz sehr groß ist, wird der Cache zum Problem

Bei der Verarbeitung von Tausenden von Datensätzen ist es verschwenderisch, sie alle auf einmal in den Speicher zu laden. Was noch schlimmer ist, ist, dass ein großer Abfragesatz den Systemprozess blockieren und Ihr Programm an den Rand eines Absturzes bringen kann.

Um zu vermeiden, dass beim Durchlaufen der Daten ein Queryset-Cache generiert wird, können Sie die Methode iterator() verwenden, um die Daten abzurufen und sie nach der Verarbeitung der Daten zu verwerfen.

star_set = Star.objects.all()
# `iterator()`可以一次只从数据库获取少量数据,这样可以节省内存
for star in star_set.iterator():
    print(star.name)
Nach dem Login kopieren

Die Verwendung der iterator()-Methode zur Verhinderung der Cache-Generierung bedeutet natürlich, dass Abfragen beim Durchlaufen desselben Abfragesatzes wiederholt ausgeführt werden. Seien Sie also vorsichtig, wenn Sie iterator() verwenden, und stellen Sie sicher, dass Ihr Code nicht wiederholt Abfragen ausführt, wenn er mit einem großen Abfragesatz arbeitet

Wenn der Abfragesatz groß ist, ist die if-Anweisung ein Problem

Wie bereits erwähnt, eignet sich der Queryset-Cache hervorragend zum Kombinieren von if-Anweisungen und for-Anweisungen, wodurch bedingte Schleifen für ein Queryset möglich sind. Für sehr große Abfragesätze ist das Caching von Abfragesätzen jedoch nicht geeignet.

Die einfachste Lösung besteht darin, exist() in Verbindung mit iterator() zu verwenden, um die Verwendung des Queryset-Cache durch die Verwendung von zwei Datenbankabfragen zu vermeiden.

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)
Nach dem Login kopieren

Eine kompliziertere Lösung besteht darin, die „erweiterte Iterationsmethode“ von Python zu verwenden, um sich vor dem Starten der Schleife das erste Element von iterator() anzusehen und dann zu entscheiden, ob eine Schleife durchgeführt werden soll.

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)
Nach dem Login kopieren

Verhindern Sie unsachgemäße Optimierung

Der Cache von Queryset wird verwendet, um die Abfragen des Programms an die Datenbank zu reduzieren. Bei normaler Verwendung wird sichergestellt, dass die Datenbank nur bei Bedarf abgefragt wird.

Verwenden Sie die Methoden exist() und iterator(), um die Speichernutzung des Programms zu optimieren. Da sie jedoch keinen Queryset-Cache generieren, können sie zusätzliche Datenbankabfragen verursachen.

Sie müssen also beim Codieren aufpassen, wenn das Programm langsamer wird. Sie müssen prüfen, wo die Engpässe im Code liegen und ob es einige kleine Optimierungen gibt, die Ihnen helfen können.

Das obige ist der detaillierte Inhalt vonDjangos QuerySets effektiv nutzen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So überprüfen Sie die Django-Version So überprüfen Sie die Django-Version Dec 01, 2023 pm 02:25 PM

Schritte zum Überprüfen der Django-Version: 1. Öffnen Sie ein Terminal- oder Eingabeaufforderungsfenster. 2. Stellen Sie sicher, dass Django nicht installiert ist, können Sie es mit dem Paketverwaltungstool installieren und den Befehl pip install django eingeben. 3. Nachdem die Installation abgeschlossen ist, können Sie python -m django --version verwenden, um die Django-Version zu überprüfen.

Django vs. Flask: Eine vergleichende Analyse von Python-Web-Frameworks Django vs. Flask: Eine vergleichende Analyse von Python-Web-Frameworks Jan 19, 2024 am 08:36 AM

Django und Flask sind beide führend bei Python-Web-Frameworks und haben beide ihre eigenen Vorteile und anwendbaren Szenarien. In diesem Artikel wird eine vergleichende Analyse dieser beiden Frameworks durchgeführt und spezifische Codebeispiele bereitgestellt. Entwicklungseinführung Django ist ein Web-Framework mit vollem Funktionsumfang, dessen Hauptzweck darin besteht, schnell komplexe Webanwendungen zu entwickeln. Django bietet viele integrierte Funktionen wie ORM (Object Relational Mapping), Formulare, Authentifizierung, Verwaltungs-Backend usw. Diese Funktionen ermöglichen es Django, große Mengen zu verarbeiten

Vor- und Nachteile des Django Framework: Alles, was Sie wissen müssen Vor- und Nachteile des Django Framework: Alles, was Sie wissen müssen Jan 19, 2024 am 09:09 AM

Django ist ein vollständiges Entwicklungsframework, das alle Aspekte des Webentwicklungslebenszyklus abdeckt. Derzeit ist dieses Framework eines der beliebtesten Web-Frameworks weltweit. Wenn Sie vorhaben, mit Django Ihre eigenen Webanwendungen zu erstellen, müssen Sie die Vor- und Nachteile des Django-Frameworks verstehen. Hier finden Sie alles, was Sie wissen müssen, einschließlich spezifischer Codebeispiele. Vorteile von Django: 1. Schnelle Entwicklung – Djang kann Webanwendungen schnell entwickeln. Es bietet eine umfangreiche Bibliothek und interne

So überprüfen Sie die Django-Version So überprüfen Sie die Django-Version Nov 30, 2023 pm 03:08 PM

So überprüfen Sie die Django-Version: 1. Um die Django-Version zu überprüfen, geben Sie den Befehl „python -m django --version“ im Terminal- oder Befehlszeilenfenster ein. 2. Um in der interaktiven Python-Umgebung zu überprüfen, geben Sie „import django“ ein print(django. get_version())“-Code; 3. Überprüfen Sie die Einstellungsdatei des Django-Projekts und finden Sie eine Liste mit dem Namen INSTALLED_APPS, die Informationen zur installierten Anwendung enthält.

Was ist der Unterschied zwischen Django-Versionen? Was ist der Unterschied zwischen Django-Versionen? Nov 20, 2023 pm 04:33 PM

Die Unterschiede sind: 1. Django 1.x-Serie: Dies ist eine frühe Version von Django, einschließlich der Versionen 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8 und 1.9. Diese Versionen bieten hauptsächlich grundlegende Webentwicklungsfunktionen. 2. Django 2.x-Serie: Dies ist die Zwischenversion von Django, einschließlich 2.0, 2.1, 2.2 und anderen Versionen. 3. Django 3.x-Serie: Dies ist die neueste Version Serie von Django. Einschließlich der Versionen 3.0, 3 usw.

So aktualisieren Sie die Django-Version: Schritte und Überlegungen So aktualisieren Sie die Django-Version: Schritte und Überlegungen Jan 19, 2024 am 10:16 AM

So aktualisieren Sie die Django-Version: Schritte und Überlegungen, spezifische Codebeispiele erforderlich. Einführung: Django ist ein leistungsstarkes Python-Web-Framework, das kontinuierlich aktualisiert und aktualisiert wird, um eine bessere Leistung und mehr Funktionen bereitzustellen. Für Entwickler, die ältere Versionen von Django verwenden, kann die Aktualisierung von Django jedoch einige Herausforderungen mit sich bringen. In diesem Artikel werden die Schritte und Vorsichtsmaßnahmen zum Aktualisieren der Django-Version vorgestellt und spezifische Codebeispiele bereitgestellt. 1. Sichern Sie die Projektdateien, bevor Sie Djan aktualisieren

Ist Django Front-End oder Back-End? Ist Django Front-End oder Back-End? Nov 21, 2023 pm 02:36 PM

Django ist das Backend. Details: Obwohl Django in erster Linie ein Backend-Framework ist, ist es eng mit der Frontend-Entwicklung verbunden. Durch Funktionen wie die Template-Engine von Django, die statische Dateiverwaltung und die RESTful-API können Front-End-Entwickler mit Back-End-Entwicklern zusammenarbeiten, um leistungsstarke, skalierbare Webanwendungen zu erstellen.

Django, Flask und FastAPI: Welches Framework ist das richtige für Anfänger? Django, Flask und FastAPI: Welches Framework ist das richtige für Anfänger? Sep 27, 2023 pm 09:06 PM

Django, Flask und FastAPI: Welches Framework ist das richtige für Anfänger? Einführung: Im Bereich der Webanwendungsentwicklung stehen viele hervorragende Python-Frameworks zur Auswahl. Dieser Artikel konzentriert sich auf die drei beliebtesten Frameworks: Django, Flask und FastAPI. Wir werden ihre Funktionen bewerten und besprechen, welches Framework für Anfänger am besten geeignet ist. Gleichzeitig stellen wir einige spezifische Codebeispiele bereit, um Anfängern ein besseres Verständnis dieser Frameworks zu erleichtern. 1. Django: Django

See all articles