Django ORM: window function with subsequent filtering
There are developers interested in solving it but it's not something possible with the ORM right now.
One proposed solution would be to add a QuerySet.subquery()
or .wrap()
method that pushes the queryset within a subquery so it can then be filtered.
Another solution is Common Table Expressions (CTE), and with the help of django-cte, you could achieve what you want:
cte = With(
YouModel.objects.annotate(
your_window_function=Window(...),
)
)
qs = cte.queryset().with_cte(cte).filter(your_window_function='something')
Which translates roughly to:
WITH cte as (
SELECT *, WINDOW(...) as your_window_function
FROM yourmodel
)
SELECT *
FROM cte
WHERE cte.your_window_function = 'something'