Django использует синтаксис среза массива python для реализации limit offset. Предположим, у вас есть 20 строк в наборе запросов, и вы хотите получить доступ к данным в пакетах по 5.
first_five_rows.objects.all()[:5]
Чтобы получить доступ к строкам от 10 до 15, вы можете использовать что-то вроде этого
next_next_five_rows.objects.all()[10:15]
Синтаксис: [OFFSET:OFFSET+LIMIT]
где offset-это количество строк, которые мы хотим пропустить, а limit-общее количество строк, которые мы хотим получить.
Model.objects.all()[СМЕЩЕНИЕ:СМЕЩЕНИЕ+ПРЕДЕЛ]
Несколько моментов, которые вы должны иметь в виду при использовании разбиения на страницы django с использованием смещения предела набора запросов:
- Отрицательная индексация не работает.
Model.objects.all()[-1]
недопустимо - Нарезка набора запросов возвращает новый набор запросов, который не возвращает эквивалентный запрос.
- Нарезка также может использоваться с шагами
Model.objects.all()[:10:2]
вернет каждый второй объект для первых 10 элементов. - После того, как вы выполняете нарезку, запрещено выполнять фильтрацию или упорядочивание из-за неоднозначного характера выходных данных.
- Если вы хотите получить только один элемент, лучше всего использовать
.first()
или.last ()
, так как запрос срезаModel.objects.filter(name='John')[0]
может дать вамIndexError
если запрос фильтра возвращает пустой список.
Подробнее вы можете прочитать в официальной документации
Эта статья впервые появилась на TL DR Tech .