Я пишу приложение Django, в котором я хочу получить все элементы, но последние из запроса. Мой запрос выглядит следующим образом:
objects = Model.objects.filter(name='alpha').order_by('rank')[:-1]
но выдает ошибку:
Assertion Error: Negative indexing not supported. Any idea where I am going wrong?
Любые предложения будут оценены.
🤔 А знаете ли вы, что...
Python имеет множество фреймворков для веб-разработки, такие как Django и Flask.
ОТРЕДАКТИРОВАНО
Django не поддерживает отрицательное индексирование QuerySet. Пожалуйста, прочтите https://code.djangoproject.com/ticket/13089 для получения дополнительной информации.
Быстрый и «грязный» способ сделать это — преобразовать Queryset в список, а затем использовать отрицательное индексирование.
objects = list( Model.objects.filter(name='alpha').order_by('rank') )[:-1]
Обратите внимание, что переменная объектов больше не является набором запросов, а представляет собой список.
Однако я бы рекомендовал использовать метод .исключать().
Если вы хотите использовать метод .exclude(), который я рекомендую, я хотел бы попросить вас прочитать решение @RaydelMiranda, написанное ниже.
Вы можете использовать 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
)
Отрицательная индексация не разрешена в Django. Однако вы можете использовать отрицательную индексацию в функции order_by и взять первый или любое количество объектов в порядке. Вы можете сделать что-то вроде этого:
objects = Model.objects.filter(name='alpha').order_by('-rank')[n:]
Здесь n
предлагает количество объектов, которые вам понадобятся. В вашем случае это будет:
objects = Model.objects.filter(name='alpha').order_by('-rank')[1:]