queryset, union, order_by над аннотированным полем - PullRequest
0 голосов
/ 04 января 2019

Кажется, что Джанго отчасти слишком много думает, когда дело касается порядка по полю.

Мне нужно объединить два запроса (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

...