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
Вернуться на верх