EDIT
Мне не нужно, чтобы это был Django ORM, мне просто нужно QuerySet
вместо RawQuerySet
.
Мне трудно конвертировать SQL
запрос в Django ORM
.
Смысл в том, чтобы переупорядочить QuerySet
из Article
объектов таким образом, чтобы каждый четвертый Article
имел permanent=True
.
Это функция:
def permanent_by_4(self):
SQL = """SELECT
id
FROM (
SELECT
id,row_number + (row_number - 1) / 3 as row_number
FROM (
SELECT
id,row_number() OVER ()
FROM articles_article
WHERE permanent != True
)s
UNION
SELECT
id,4 * row_number() OVER ()
FROM articles_article
WHERE permanent = True
) s
ORDER BY row_number"""
return Article.objects.raw(SQL)
Основная проблема - получить row_number
.
Я попытался F('row_number')
, который не получает номер строки.
Знаете, как его конвертировать?
EDIT
SUBQUERY = """SELECT
id,row_number + (row_number - 1) / 3 as row_number
FROM (
SELECT
id,row_number() OVER ()
FROM articles_article
WHERE permanent != True
)s
UNION
SELECT
id,4 * row_number() OVER ()
FROM articles_article
WHERE permanent = True"""
return Article.objects.annotate(row_number=RawSQL(SUBQUERY, ['row_number'])).order_by('row_number')
Я пытаюсь аннотировать набор запросов с помощью row_number
, а затем упорядочить его, но он возвращает ProgrammingError: subquery must return only one column