Нарезка кверисета после функции 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 записей в соответствии с отфильтрованным набором запросов.