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
相关产品推荐
相关产品推荐

