Как получить эквивалент python [:-1] в django ORM?

Я пишу приложение 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.


4
1 160
4

Ответы:

ОТРЕДАКТИРОВАНО

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:]

    query=model.objects.filter(user=request.user)
    if query.exists():
        query=query.last()