Альтернативные строки набора запросов из разных предложений order_by () - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь реализовать пользовательское представление, в котором сообщения чередуются между самыми новыми и наиболее проголосовавшими:

| 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')
...