Heim  >  Artikel  >  Backend-Entwicklung  >  ORM-Optimierungstipps im Django-Framework

ORM-Optimierungstipps im Django-Framework

PHPz
PHPzOriginal
2023-06-17 11:57:581196Durchsuche

Django ist ein beliebtes Python-Web-Framework. Seine ORM-Funktion (Object-Relational Mapping) wird häufig in der Webentwicklung verwendet und ermöglicht es Entwicklern, mit Python-Objekten zu arbeiten, ohne die Datenbank direkt zu bedienen. Mit zunehmendem Datenvolumen kann jedoch die Leistung des ORM leiden. Daher stellen wir in diesem Artikel einige Django ORM-Optimierungstipps vor, um die Leistung Ihrer Anwendung zu verbessern.

  1. Verwenden Sie .select_lated()

Die .select_lated()-Methode in Django ORM kann die Daten aller zugehörigen Objekte vorab laden und so mehrere Abfragen an die Datenbank vermeiden. Standardmäßig ruft Django beim Abfragen der Datenbank mithilfe des ORM nur Daten vom Hauptmodell ab. Wenn das Modell einen oder mehrere Fremdschlüssel hat, können wir alle Fremdschlüsselobjekte über .select_lated() abrufen. Beispiel:

books = Book.objects.select_related('publisher').all()

Im obigen Code verfügt das Büchermodell über einen Fremdschlüsselverleger. Durch Auswahl des zugehörigen Herausgebermodells können wir alle zugehörigen Daten in einer Abfrage abrufen. Dies vermeidet wiederholte Zugriffe auf die Datenbank bei nachfolgenden Abfragen und verbessert die Leistung.

  1. Verwenden Sie .prefetch_lated()

Ähnlich wie .select_lated() kann die Methode .prefetch_lated() auch die Daten des angegebenen Modells vorab in den Speicher laden, um mehrere Datenbankabfragen zu vermeiden. Der Unterschied besteht darin, dass die Methode .prefetch_related() für den Zugriff zwischen Many-to-Many-, Reverse-Assoziations- und anderen Modellen verwendet wird, zum Beispiel:

publishers = Publisher.objects.prefetch_related('books').all()

Im obigen Code verfügt das Publisher-Modell über ein Reverse-Assoziationsbuch und .prefetch_related () kann einmal verwendet werden. Rufen Sie alle Herausgeber auf einmal ab, wodurch der Aufwand mehrerer Datenbankabfragen vermieden wird.

  1. Verwenden Sie .values() und .values_list()

Die Methoden .values() und .values_list() in Django ORM können verwendet werden, um die Daten des angegebenen Modells in einer Liste zu sammeln und so die Anzahl zu reduzieren Abfragen an die Datenbank. Zum Beispiel

authors = Author.objects.all().values('name', 'email')

Im obigen Code müssen wir nur den Namen und die E-Mail-Adresse des Autors abrufen und die Methode .values() verwenden, um die Ergebnisse auf einmal zu erhalten.

  1. Schleifenabfrage ersetzen

In Django ORM kann die Methode zum Abrufen mehrerer Daten durch Schleifenabfrage zu Leistungsengpässen führen. Beispielsweise wird der folgende Code viele Datenbankabfragen verursachen:

for author in Author.objects.all():
    books = author.books.all()
    # do something with the books

Im Gegensatz dazu können wir die Methode .prefetch_lated() verwenden, um Schleifenabfragen zu ersetzen und Datenbankabfragen zu reduzieren:

authors = Author.objects.prefetch_related('books')
for author in authors:
    # get books from prefetched related
    books = author.books.all()
    # do something with the books

Im obigen Code verwenden wir .prefetch_lated() Methode zum Vorabladen von Buchautorendaten, um die Anzahl der Datenbankzugriffe zu reduzieren.

  1. Datenbankindizes verwenden

Django ORM unterstützt die Verwendung von Datenbankindizes, um Abfragen zu beschleunigen. Indizes können die Daten in der Datenbank nach angegebenen Spalten sortieren und so den Abfrageprozess effizienter gestalten. In Django können wir die Meta-Klasse des Modells verwenden, um Indizes zu definieren, zum Beispiel:

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

    class Meta:
        indexes = [
            models.Index(fields=['title'], name='title_index'),
            models.Index(fields=['author'], name='author_index'),
        ]

Im obigen Code definieren wir zwei Indizes, die basierend auf den Spalten „Titel“ und „Autor“ abgefragt werden sollen.

  1. Datenbankverbindungspool

In Django ORM ist die Datenbankverbindung eine teure Ressource. Daher können wir den Datenbankverbindungspool verwenden, um eine Reihe von Verbindungen aufrechtzuerhalten und den Overhead von Datenbankverbindungen zu reduzieren. Für Django-Anwendungen können Sie das Modul Django-dbconn-reuse verwenden, um Datenbankverbindungspooling zu implementieren. Nach der Installation müssen Sie nur den folgenden Code zur Datei „settings.py“ von Django hinzufügen, um den Verbindungspool zu aktivieren:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'conn_max_age': 60,
            'charset': 'utf8mb4',
            'pool_size': 5
        }
    }
}

Im obigen Code haben wir die MySQL-Datenbank verwendet und die Verbindungspoolgröße auf 5 Verbindungen festgelegt.

Fazit

In Django-Anwendungen ist ORM eine sehr leistungsstarke Funktion, die den Interaktionsprozess zwischen der Anwendung und der Datenbank erheblich vereinfachen kann. Die Verwendung der oben genannten Tipps und Optimierungen zur Verbesserung der Leistung Ihres ORM kann uns dabei helfen, diese leistungsstarke Funktion besser zu nutzen und die Anwendungsleistung und -zuverlässigkeit zu verbessern.

Das obige ist der detaillierte Inhalt vonORM-Optimierungstipps im Django-Framework. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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