Нарезка кверисета после функции order_by() в Django

У меня есть order_by() модель django и я получил queryset со следующим результатом:

queryset = <QuerySet [<MyModel: MyModel object (4)>, <MyModel: MyModel object (2)>, 
<MyModel: MyModel object (1)>, <MyModel: MyModel object (3)>, <MyModel: MyModel object (5)>]>

Результат не отсортирован по id.

А я хочу, чтобы slice queryset, который имеет порядок MyModel с id greater than 1, получил следующие результаты:

new_queryset = <QuerySet [<MyModel: MyModel object (4)>, <MyModel: MyModel object (2)>]>

Есть ли способ сократить запрос без цикла?

for index in range(len(queryset)):
    if queryset[index].id == 1:
        new_queryset = queryset[:index]
        break

Заранее благодарю вас.

Вы можете использовать filter или exclude функции, которые предоставляет QuerySetManager. В основном вы можете сделать следующее:

new_queryset = MyModel.objects.filter(id__gt=1)

Надеюсь, вы решите проблему.

Предполагая, что вы упорядочиваете набор запросов на основе publish_datetime и modified, вы можете просто получить запись с нужным идентификатором и отфильтровать набор запросов в соответствии с упорядочением, относящимся к объекту, следующим образом:

from django.db.models import F, Q

reference_object = MyModel.objects.get(id=1)
queryset = MyModel.objects.filter(
    Q(publish_datetime__lt=reference_object.publish_datetime) |
    Q(
        Q(publish_datetime=reference_object.publish_datetime) &
        Q(modified__gt=reference_object.modified)
    )
)

Вы получите результаты, где посты были опубликованы до нужного объекта, или с тем же временем публикации, но с более поздней измененной датой

Вы можете нарезать результат списка, как показано ниже:

new_queryset = MyModel.objects.filter(id__gt=1)[:5]

"5" означает, что будет отображено только 5 записей в соответствии с отфильтрованным набором запросов.

Вернуться на верх