首页 >数据库 >mysql教程 >如何在没有原始 SQL 的情况下在 Django 中高效查询没有分配志愿者的部门?

如何在没有原始 SQL 的情况下在 Django 中高效查询没有分配志愿者的部门?

Barbara Streisand
Barbara Streisand原创
2025-01-02 19:16:44904浏览

How Can I Efficiently Query for Departments with No Assigned Volunteers in Django Without Raw SQL?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn