我有以下型号:

class Volunteer(models.Model):
    first_name = models.CharField(max_length=50L)
    last_name = models.CharField(max_length=50L)    
    email = models.CharField(max_length=50L)
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)


class Department(models.Model):
    name = models.CharField(max_length=50L, unique=True)
    overseer = models.ForeignKey(Volunteer, blank=True, null=True)
    location = models.CharField(max_length=100L, 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=100L, blank=True, null=True)

我想查询所有没有分配志愿者的部门.我可以使用以下查询执行此操作:

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?

推荐答案

您可以通过在查找中遵循向后关系来实现这一点.

>>> qs = Department.objects.filter(departmentvolunteer__isnull=True).values_list('name', flat=True)
>>> print(qs.query)
SELECT "app_department"."name" FROM "app_department" LEFT OUTER JOIN
"app_departmentvolunteer" ON ( "app_department"."id" = "app_departmentvolunteer"."department_id" )
WHERE "app_epartmentvolunteer"."id" IS NULL

以下是关于"跨越多值关系"的查询的文档:https://docs.djangoproject.com/en/stable/topics/db/queries/#spanning-multi-valued-relationships

Django相关问答推荐

DRF中是否有有效的更新有序数据的算法?

Django ORM Groupby

如何在Django模板中获取组中对象的整体计数器(&Q;)?

情节主题更改问题

Django celery 页面给出 404

在 Bootstrap 中使单击的选项卡处于活动状态

如何运行克隆的 Django 元素?

Django - 强制执行 ManyToManyField 唯一项

Django 基于角色的视图?

一个简单的Django和CSS示例

在 Django 中获取下一个和上一个对象

在 virtualenv Ubuntu 12.10 中使用 pip 安装 lxml 错误:command 'gcc' failed with exit status 4

使用 Python / Django 的 Google API 示例的 Oauth

如何在 Django Rest Framework SimpleRouter 上使斜杠可选

Django JavaScript 文件

Django:以 10 为底的 int() 的无效文字

django - 使用 get_or_create 自动创建用户时设置用户权限

关闭 Django Rest Framework ModelViewSet 的自动分页

确保只有一个工作人员在运行多个工作人员的 pyramid 网络应用程序中启动 apscheduler 事件

django rest 框架:从序列化程序 validate() 方法设置字段级错误