Как получить эквивалент python [: -1] в django ORM? - PullRequest
0 голосов
/ 28 января 2019

Я пишу приложение Django, в котором я хочу получить все элементы, но последний из запроса.Мой запрос выглядит так:

objects = Model.objects.filter(name='alpha').order_by('rank')[:-1]

, но выдает ошибку:

Ошибка подтверждения: отрицательная индексация не поддерживается.Любая идея, где я иду не так?

Любые предложения будут оценены.

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Вы можете использовать QuerySet.last () , чтобы получить последнее и использовать его идентификатор для исключения его из результатов.

objects = Model.objects.filter(name='alpha').order_by('rank')
last = objects.last()
objects = objects.exclude(pk=last.pk)

Запрос на исключение из результата всех объектов, ранжированныхс минимальным значением, найденным в БД:

objects = Model.objects.annotate(
    mini_rank=Min('rank'),         # Annotate each object with the minimum known rank
).exclude(
    mini_rank=F('rank')            # Exclude all objects ranked with the minimum value found   
)
0 голосов
/ 14 мая 2019

Отрицательное индексирование не допускается в Django.Однако вы можете использовать отрицательную индексацию в функции order_by и взять первое или любое количество объектов в заказе.Вы можете сделать что-то вроде этого:

objects = Model.objects.filter(name='alpha').order_by('-rank')[n:]

Здесь n предлагает количество объектов, которые вам понадобятся.В вашем случае это будет:

objects = Model.objects.filter(name='alpha').order_by('-rank')[1:]
0 голосов
/ 28 января 2019

EDITED

Django не поддерживает отрицательную индексацию в QuerySets.Пожалуйста, прочитайте https://code.djangoproject.com/ticket/13089 для получения дополнительной информации.

Быстрый и «грязный» способ сделать это - преобразовать Queryset в список и затем использовать отрицательную индексацию.

objects = list( Model.objects.filter(name='alpha').order_by('rank') )[:-1]

Обратите внимание, что переменная objects больше не является набором запросов, а списком.

Однако я бы порекомендовал использовать .exclude () method.

Если вы хотите использовать метод .exclude (), который я рекомендую, я бы хотел попросить вас прочитать решение, которое @RaydelMiranda написал ниже.

...