我怎么能在django的查询集中有一个子查询?例如,如果我有:
select name, age from person, employee where person.id = employee.id and
employee.id in (select id from employee where employee.company = 'Private')
Run Code Online (Sandbox Code Playgroud)
这就是我所做的.
Person.objects.value('name', 'age')
Employee.objects.filter(company='Private')
Run Code Online (Sandbox Code Playgroud)
但它没有工作,因为它返回两个输出...
Ram*_*ast 42
正如ypercube所提到的,您的用例不需要子查询.
但无论如何,因为很多人进入这个页面学习如何做分查询这里是如何做到的.
employee_query = Employee.objects.filter(company='Private').only('id').all()
Person.objects.value('name', 'age').filter(id__in=employee_query)
Run Code Online (Sandbox Code Playgroud)
资料来源:http: //mattrobenolt.com/the-django-orm-and-subqueries/
Jan*_*hko 21
ids = Employee.objects.filter(company='Private').values_list('id', flat=True)
Person.objects.filter(id__in=ids).values('name', 'age')
Run Code Online (Sandbox Code Playgroud)
Dmi*_*nch 11
您的问题的正确答案在这里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]))
Run Code Online (Sandbox Code Playgroud)
您可以使用未评估的查询集来过滤主查询集,从而在Django中创建子查询.在你的情况下,它看起来像这样:
employee_query = Employee.objects.filter(company='Private')
people = Person.objects.filter(employee__in=employee_query)
Run Code Online (Sandbox Code Playgroud)
我假设你有一个从一个相反的关系Person来Employee命名employee.我发现当我试图了解过滤器的工作原理时,查看查询集生成的SQL查询会很有帮助.
print people.query
Run Code Online (Sandbox Code Playgroud)
正如其他人所说的那样,你的实例并不需要子查询.您可以加入员工表:
people2 = Person.objects.filter(employee__company='Private')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30223 次 |
| 最近记录: |