Heim > Datenbank > MySQL-Tutorial > Wie kann ich mit Django ORM Left Joins effizient nach Abteilungen ohne zugewiesene Freiwillige suchen?

Wie kann ich mit Django ORM Left Joins effizient nach Abteilungen ohne zugewiesene Freiwillige suchen?

Linda Hamilton
Freigeben: 2024-12-28 06:26:11
Original
760 Leute haben es durchsucht

How Can I Efficiently Query for Departments Without Assigned Volunteers Using Django ORM Left Joins?

Left Joining in Django ORMs

Beim Umgang mit komplexen Datenbankbeziehungen können Situationen auftreten, in denen Sie Daten abfragen und dabei die berücksichtigen müssen Vorhandensein oder Fehlen zugehöriger Aufzeichnungen. Eine Technik hierfür ist der Left Join.

Angenommen, Sie haben die folgenden Modelle:

class Volunteer(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)    
    email = models.CharField(max_length=50)
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)


class Department(models.Model):
    name = models.CharField(max_length=50, unique=True)
    overseer = models.ForeignKey(Volunteer, blank=True, null=True)
    location = models.CharField(max_length=100, null=True)


class DepartmentVolunteer(models.Model):
    volunteer = models.ForeignKey(Volunteer)
    department = models.ForeignKey(Department)
    assistant = models.BooleanField(default=False)
    keyman = models.BooleanField(default=False)
    captain = models.BooleanField(default=False)
    location = models.CharField(max_length=100, blank=True, null=True)
Nach dem Login kopieren

Sie möchten alle Abteilungen abfragen, denen keine Freiwilligen zugewiesen sind . Die folgende unformatierte SQL-Abfrage würde dies erreichen:

SELECT 
    d.name 
FROM   
    vsp_department AS d
LEFT JOIN vsp_departmentvolunteer AS dv
ON d.id = dv.department_id  
WHERE
    dv.department_id IS NULL;
Nach dem Login kopieren

In Django können Sie eine Left-Join-Operation ausführen, indem Sie der Rückwärtsbeziehung in der Suche folgen. Hier ist das Django-Äquivalent der obigen Roh-SQL-Abfrage:

qs = Department.objects.filter(
    departmentvolunteer__isnull=True).values_list('name', flat=True)
Nach dem Login kopieren

Die generierte Abfrage ist nahezu identisch mit der Roh-SQL-Abfrage, wie unten gezeigt:

SELECT "app_department"."name"
FROM "app_department" LEFT OUTER JOIN "app_departmentvolunteer"
ON ("app_department"."id" = "app_departmentvolunteer"."department_id")
WHERE "app_departmentvolunteer"."id" IS NULL
Nach dem Login kopieren

Diese Methode ermöglicht Ihnen um Daten effizient abzufragen und gleichzeitig die Leistungsfähigkeit von Django ORMs zu nutzen, was im Vergleich zu reinem SQL einen pythonischeren und wartbareren Ansatz bietet.

Das obige ist der detaillierte Inhalt vonWie kann ich mit Django ORM Left Joins effizient nach Abteilungen ohne zugewiesene Freiwillige suchen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage