You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django ORM是否支持FROM子句子查询以过滤窗口函数标注字段?

问题描述

在SQL中我可以编写如下查询:

select a, b, c from (
  select a, b, c from table_a
)
where a = something

请问Django ORM中可以实现类似查询吗?我此前只用到过子查询主键映射到父查询某列的子查询类型,本次场景不适用该方案。

具体场景

我现有一个查询,其中使用Window窗口函数标注了自定义列,由于SQL执行顺序中WHERE子句优先级高于标注操作,窗口函数生成的标注字段无法直接放在WHERE子句中过滤。因此我需要先把该查询作为子查询,将其结果视作一张独立表,再在外层父查询中做过滤。

相关模型及查询代码
class Item(models.Model):
  category = models.ForeignKey(Category, on_delete=models.CASCADE)

def get_whens(category_ordering, page_size):
    page_number = Ceil(Cast(F('row_number') * 1.0 /
                            page_size, output_field=FloatField()))

    return [
        When(
            category__name=c,
            then=(
                Cast(
                    (page_number * len(category_ordering) - len(category_ordering) +
                     category_ordering.index(c) + 1)  # real_page_number
                    *
                    page_size
                    -
                    page_size
                    +
                    F('row_number')
                    -
                    (
                        (page_number - 1)
                        *
                        page_size
                    ),
                    output_field=IntegerField()
                )
            )
        )
        for c in category_ordering
    ]


q = (
        Item
        .objects
        .annotate(
            row_number=Window(
                expression=RowNumber(),
                partition_by=[F('category_id')]
            )
        )
        .annotate(
            order_value=Case(*get_whens(category_ordering, page_size))
        )
        .order_by('order_value')
)
最新进展

目前未找到可行的ORM实现方案,可能需要改为编写原生SQL实现需求。


内容的提问来源于stack exchange,提问作者user1849962

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:24:03