QUALIFY на неоконном поле
Как указано здесь, начиная с 4.2 Django поддерживает fIltering против оконной функции.
Я попробовал, и Django успешно создает предложение QUALIFY при использовании поля окна в предложении фильтра. Однако, если используется, скажем, поле модели, предикат присваивается предложению WHERE. Поскольку предложение WHERE применяется перед предложением QUALIFY, оконная функция применяется только к строкам, отфильтрованным с помощью WHERE.
Вот моя реальная проблема: я хочу получить позицию объекта в запросе. Я думал, что этого можно добиться с помощью функции window RowNumber
и фильтрации по id объекта:
def get_position(qs, obj, order_by=None):
qs.annotate(
position=Window(
expression=RowNumber(),
order_by=order_by
)
)
obj = qs.get(id=obj.id)
# obj.position will always be 1, as WHERE is run before QUALIFY
return obj.position