Я пытаюсь реализовать пользовательское представление, в котором сообщения чередуются между самыми новыми и наиболее проголосовавшими:
| post | vote_score | created_at |
====================================
| A | 20 | 01/01/2020 | ---> Top voted
| F | 0 | 05/01/2020 | ---> Newest
| I | 19 | 02/01/2020 | ---> Second to Top Voted
| B | 2 | 04/01/2020 | ---> Second to Newest
Я знаю, что мог бы просто выполнить 2 запроса, один сортировать по vote_score
, а другой - по created_at
, а затем чередуйте строки в Python. Мне было интересно, есть ли более эффективный способ сделать это в базе данных, чтобы мне не приходилось извлекать всю таблицу и чтобы в моих запросах можно было использовать LIMIT
и OFFSET
для поддержки простого разбиения на страницы.
Я играл с annotate
, Window()
и RowNumber()
, но не мог заставить его работать:
qs.annotate(row_number=Window(
expression=RowNumber()*2,
order_by=F('created_at').desc())
).annotate(row_number=Window(
expression=RowNumber()*2+1,
order_by=F('vote_score').desc())
).order_by('row_number')