LEFT JOIN Django ORM:原始 SQL查詢的替代方案
問題:
考慮下列models:
class Volunteer(models.Model): ... class Department(models.Model): ... class DepartmentVolunteer(models.Model): ...
要查詢所有沒有分配志願者的部門,可以使用以下SQL 語句:
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;
是否有一種更像Django的方式來執行此查詢,或者應該堅持生吃SQL?
答案:
Django 提供了一種更簡潔、更具表現力的方式來使用filter() 方法進行相同的查詢:
qs = Department.objects.filter( departmentvolunteer__isnull=True).values_list('name', flat=True)
此查詢跨越Department 和DepartmentVolunteer 之間的多值關係,如Django 文件所述: https://docs.djangoproject.com/en/stable/topics/db/queries/#spanning-multi-valued-relationships
Django 產生的結果查詢是:
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
這種方法消除了對原始SQL 的需求,並提供了更具可讀性和可維護性的查詢。
以上是如何在沒有原始 SQL 的情況下在 Django 中高效查詢沒有分配志願者的部門?的詳細內容。更多資訊請關注PHP中文網其他相關文章!