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
Linda HamiltonOriginal
2024-12-28 06:26:11757Durchsuche

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)

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;

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)

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

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!

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