django - 如何在 Django ORM 中的 From 子句中编写子查询

标签 django postgresql django-models django-rest-framework django-orm

我想使用 django orm 编写此查询

SELECT depname, empno, salary, enroll_date
FROM
  (SELECT depname, empno, salary, enroll_date,
          rank() OVER (PARTITION BY depname ORDER BY salary DESC) AS pos
     FROM empsalary
  ) AS ss
WHERE pos < 3;

我当前的 ORm 查询
EmpSalary.objects.values('depname', 'empno', 'salary', 'enroll_date').annotate(
pos= Window(
                expression=RowNumber(),
                partition_by=[F('depname')],
                order_by=F('salary').desc(),
            )
)


上面的 ORM 查询集粗略地转化为内部查询
SELECT depname, empno, salary, enroll_date,
          rank() OVER (PARTITION BY depname ORDER BY salary DESC) AS pos
     FROM empsalary

我想知道如何在外部查询的 FROM 子句中获取整个内部查询。

最佳答案

事实上,不可能使用 WindowWHERE 内查询条款。因此,请改用 Subquery :

from django.db.models import OuterRef, Subquery

top_salaries = EmpSalary.objects.filter(
    depname=OuterRef('depname')
).order_by('-salary')[:3]
result = EmpSalary.objects.filter(
    pk__in=Subquery(top_salaries.values('pk'))
).values('depname', 'empno', 'salary', 'enroll_date')

关于django - 如何在 Django ORM 中的 From 子句中编写子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60864345/

相关文章:

python - 编辑 Django 管理表单,以便只有员工用户才能更改用户密码

python - 我可以在没有 django 的情况下使用 celery 吗

Django 错误 (13, 'Permission denied')

postgresql - 如何在 postgreSql 中使用更新

postgresql - 如何为 PostgreSQL 指定端口?

python-3.x - 名称 'conn' 未定义 : NameError

sql - 地址簿数据库设计 : denormalize?

python - Django:限制模型数据

python - 如何透明地在 Django 应用程序中强制执行域完整性?

python - Django 的每日访问量是否超过 10 万次?