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!