LEFT JOIN Django ORM: Eine Alternative zu Raw SQL-Abfragen
Frage:
Überlegen die folgenden Modelle:
class Volunteer(models.Model): ... class Department(models.Model): ... class DepartmentVolunteer(models.Model): ...
Zur Abfrage aller Abteilungen ohne Zuweisung Freiwillige können die folgende SQL-Anweisung verwenden:
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;
Gibt es eine Django-ähnlichere Möglichkeit, diese Abfrage durchzuführen, oder sollte man bei reinem SQL bleiben?
Antwort :
Django bietet eine prägnantere und ausdrucksstärkere Möglichkeit, dieselbe Abfrage mithilfe von filter() durchzuführen. Methode:
qs = Department.objects.filter( departmentvolunteer__isnull=True).values_list('name', flat=True)
Diese Abfrage umfasst die mehrwertige Beziehung zwischen Department und DepartmentVolunteer, wie in der Django-Dokumentation beschrieben: https://docs.djangoproject.com/en/stable/topics/db/queries /#spanning-multi-valued-relationships
Die resultierende Abfrage, die von Django generiert wurde ist:
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
Dieser Ansatz macht Roh-SQL überflüssig und bietet eine besser lesbare und wartbare Abfrage.
Das obige ist der detaillierte Inhalt vonWie kann ich in Django ohne Raw SQL effizient nach Abteilungen ohne zugewiesene Freiwillige suchen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!