这种子查询在django中是可能的吗?

  • 本文关键字:种子 查询 django django
  • 更新时间 :
  • 英文 :


在sql中我可以这样做-

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

这在django中可能吗?我只使用过这种类型的子查询,例如,子查询的主键映射到父查询中的一行的列。我不想在这种情况下这样做。

这是上下文

我有一个查询,它有一个带注释的列,使用一个窗口框架。这样的表达式不能包含在WHERE子句中,因为sql首先计算WHERE子句。因此,有必要首先将此查询作为子查询执行,然后像使用自己的表一样使用结果。在这个父查询中,我可以过滤。

参见- https://learnsql.com/blog/window-functions-not-allowed-in-where/

class Item(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE)
# you asked for it!
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')
)

最新

我认为这是不可能的。发现了一个类似的问题——如何在django ORM的From子句中编写子查询

我将不得不写一个原始的sql查询。

我给这个票据添加了一个注释- https://code.djangoproject.com/ticket/28333#comment:17

我给这个问题添加了一个注释,这样我们就可以通过django的ORM - https://code.djangoproject.com/ticket/28333#comment:17来解决这种问题。

现在我已经解决了这个问题与这个第三方软件包- https://github.com/dimagi/django-cte。它通过django form提供了常用的表表达式。

我的解决方案是基于包中给出的基本示例。

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')
)
cte = With(q)
actual_queryset = (
cte
.join(Item, pk=cte.col.pk)
.with_cte(cte)
.annotate(order_value=cte.col.order_value)
.order_by('order_value')
)

最新更新