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中文网其他相关文章!