Select_related-Methode in Django

Salman Mehmood 20 Juni 2023
Select_related-Methode in Django

Der Artikel befasst sich mit Abfragesätzen, der Arbeit mit diesen Abfragen und der Verwendung der Methode select_related() in Django. Bei der Verwendung des Django-Frameworks verwenden wir meistens das query set.

Angenommen, wir haben eine Datenbank und wir werden eine Abfrage durchführen. Nehmen wir an, wir haben ein Modell namens Lieferant, und mit diesem Lieferanten greifen wir alle Lieferanten auf, also haben wir eine Liste von Lieferanten, und diese Liste wird als Abfragesatz bezeichnet. .

Wir sehen uns die Datei views.py an, wo wir Logik schreiben und zwei Modelle erstellen. Wir beginnen damit, Code zu schreiben, der den Anwendungsfall der select_related()-Methode erklärt.

Zuerst haben wir Mitarbeiter mit objects.all() geholt. Wir müssen die Liste dieses Mitarbeiters durchlaufen und die Mitarbeiternamen mit emploee.name drucken.

Code:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all()
    for emplyee in employees:
        print(emplyee.name)

Ausgang:

Jane Doe
John Doe
Simpson
John Simpson

Wenn wir das Debug-Tool verwenden und zu unserem Browser gehen, sehen wir, dass es alle Mitarbeiter und entsprechenden Abteilungen und ihre Details abruft. Da das objects.all() alle Mitarbeiter auswählt und alle Details erhält.

Das Problem beginnt, wenn wir auf das zugehörige Modell zugreifen. Zum Beispiel sehen wir uns unsere Datei models.py an, und das Modell Mitarbeiter, das ein verwandtes Modell ist, ist die Abteilung selbst.

Wir drucken den Mitarbeiternamen und den Abteilungsnamen mit dem folgenden Code.

Code:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all()
    for emplyee in employees:
        print(emplyee.name, emplyee.department.name)

Wir verwenden im obigen Code employee.department, und die Abteilung ist ein Fremdschlüssel. Es wird uns das Objekt Abteilung geben, in dem sich unsere Abteilungsnamen befinden.

Ausgang:

Jane Doe HR
John Doe Accounts
Simpson Purchase
John Simpson Purchase

Wir können mehrere Abfragen sehen, wenn wir in den Browser gehen, während wir unsere Django-Anwendung mit Hilfe des Django-Debug-Tools ausführen. Wir können in der ersten Abfrage sehen, dass sie alle Mitarbeiter auswählt, und die zweite wählt die Abteilung aus, die eine ID von 1 hat.

Wenn wir die gleiche ID des Mitarbeiters haben, obwohl es sich um denselben Underlying handelt, geht das ORM zweimal in diese Tabelle und holt die Duplikate. Angenommen, wir haben hundert Mitarbeiter in unserem Unternehmen, dann werden 101 Abfragen ausgeführt, also 100 Abfragen von der Abteilung und eine Abfrage von Mitarbeiter.

Dies wird im ORM auch als klassisches Endlos-Eins-Problem bezeichnet. Es ruft diese Mitarbeiter und ihre entsprechenden Abteilungen mit der Methode select_related() ab, und wir müssen das Feld unseres Modells in der Methode übergeben.

Es ist also sinnvoll, das Feld in Beziehung zu setzen, und in unserem Fall verwenden wir das Feld als Abteilung.

Code:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all().select_related("department")
    for emplyee in employees:
        print(emplyee.name, emplyee.department.name)
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn