在Django中如何在查询集中使用子查询?

53 投票
6 回答
92349 浏览
提问于 2025-04-17 08:37

我该如何在Django的查询集中使用子查询呢?比如说,如果我有:

select name, age from person, employee where person.id = employee.id and
employee.id in (select id from employee where employee.company = 'Private')

这是我目前做的。

Person.objects.value('name', 'age')
Employee.objects.filter(company='Private')

但是它没有正常工作,因为它返回了两个结果……

6 个回答

18

你问题的正确答案在这里 https://docs.djangoproject.com/en/2.1/ref/models/expressions/#subquery-expressions

举个例子:

>>> from django.db.models import OuterRef, Subquery
>>> newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at')
>>> Post.objects.annotate(newest_commenter_email=Subquery(newest.values('email')[:1]))
73

正如ypercube提到的,你的情况其实不需要使用子查询。

不过,很多人可能会来到这个页面想学习怎么做子查询,所以这里就简单介绍一下怎么操作。

from django.db.models import Subquery

employee_query = Employee.objects.filter(company='Private').only('id').all()
Person.objects.value('name', 'age').filter(id__in=Subquery(employee_query))

来源: http://mattrobenolt.com/the-django-orm-and-subqueries/

56

在编程的世界里,有时候我们会遇到一些问题,尤其是在使用特定的工具或库时。比如,有人可能在使用某个库的时候,发现它的某些功能不太好用,或者在文档中找不到相关的说明。这种情况下,大家通常会去网上的技术论坛,比如StackOverflow,寻求帮助。

在这些论坛上,用户可以提问,描述他们遇到的问题,并且其他人会根据自己的经验来回答。这样一来,大家就可以互相帮助,解决问题。

有时候,问题的解决方案可能会涉及到一些代码示例,帮助提问者更好地理解如何解决问题。这些代码示例通常会被放在代码块中,比如

ids = Employee.objects.filter(company='Private').values_list('id', flat=True)
Person.objects.filter(id__in=ids).values('name', 'age')
,这样就能清晰地展示出来。

总之,技术论坛是一个很好的资源,可以帮助我们解决编程中遇到的各种问题,特别是当我们对某些工具或库不太熟悉的时候。

撰写回答