Как преобразовать этот RawQuerySet в QuerySet? - PullRequest
0 голосов
/ 06 ноября 2018

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

...