编辑
我完全不需要成为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