【发布时间】:2018-02-24 23:22:15
【问题描述】:
我在 Django 中有两个模型,A 和 B。
每个A 都有几个Bs 分配给它,Bs 是有序的,这是通过一个字段B.order_index 完成的,对于任何A,它从零开始向上计数。
我想编写一个查询来检查是否有任何A,其中一些Bs 有间隙或有重复的order_index 值。
在 SQL 中,可以这样完成:
SELECT order_index, RANK() OVER(PARTITION BY a_id ORDER BY order_index ASC) - 1 AS rnk
WHERE rnk = order_index'
但是,当我在 Django 中使用此代码尝试此操作时:
B.objects.annotate(rank=RawSQL("RANK() OVER(PARTITION BY a_id ORDER BY order_index ASC) - 1", [])).filter(rank=F('order_index'))
我收到一条错误消息:
django.db.utils.ProgrammingError: window functions are not allowed in WHERE
LINE 1: ...- 1) AS "rank" FROM "main_b" WHERE (RANK() OVE...
在 SQL 中,通过将整个事物包装在子查询中并将 Where 子句应用于该子查询,这很容易解决。我怎样才能在 Django 中做同样的事情?
【问题讨论】:
-
Django 2.0 在 ORM 中引入了 Window 函数:docs.djangoproject.com/en/2.0/ref/models/expressions/…
-
嗨@Florian Dietz。你找到这个问题的 ORM 解决方案了吗?
-
django bug tracker 中有一张票:code.djangoproject.com/ticket/28333
标签: django django-models window-functions