【发布时间】:2019-05-31 03:23:48
【问题描述】:
在按字段排序时,Django 似乎有点想太多了。
我需要合并两个查询(queryset),第一个是排名,第二个不是,在最终结果中我想要一个 queryset,因为它将被分页。
我会给你一个使用User模型的例子,这样你就可以在家里尝试了。
from django.contrib.auth.models import User
from django.db.models import F, Value, IntegerField
from django.db.models.expressions import RawSQL
queryset = User.objects
a = queryset.filter(email__contains='a').annotate(rank=RawSQL("rank() OVER (ORDER BY id desc)", [], output_field=IntegerField()))
b = queryset.filter(email__contains='b').annotate(rank=Value(None, output_field=IntegerField()))
a.union(b).order_by(F('rank').desc(nulls_last=True))
# DatabaseError: ORDER BY term does not match any column in the result set.
a.order_by(F('rank').desc(nulls_last=True))
# this is OK
b.order_by(F('rank').desc(nulls_last=True))
# ProgrammingError: non-integer constant in ORDER BY
# LINE 1: ...ERE "auth_user"."email"::text LIKE '%b%' ORDER BY NULL DESC ...
这是一个 Django 错误吗?
我正在使用 Django==1.11.17
【问题讨论】:
-
最后一个错误来自数据库,而不是来自 Django。我们可以
print(b.order_by(F('rank').desc(nulls_last=True)).query)查看这里生成的SQL。
标签: python django django-models