如何将此RawQuerySet转换为QuerySet?

时间:2018-11-06 15:53:47

标签: sql django database postgresql django-orm

编辑 我完全不需要成为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'),但没有得到row_number。

你知道如何转换吗?

编辑

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注释queryset,然后按它排序,但它返回ProgrammingError: subquery must return only one column

0 个答案:

没有答案