Step 4 (S-44804)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/14831/step/4

Step 4 (S-44804) 1.png

[00:00 - 00:18] давайте рассмотрим еще 1 чуть более сложный сценарий загрузки данных так называемые progressive лодинг а последовательная загрузка прогресс сложным стал популярным в последнее время а с ростом популярности социальных сетей и мобильных приложений


[00:18 - 00:37] а в этих случаях последовательная загрузка это естественный способ читать например ленту новостей и весьма распространенный прием на данный момент а помимо дизайна прогресс сходен есть некоторые технические преимущества


Step 4 (S-44804) 2.png

[00:37 - 00:53] а сейчас мы рассмотрим какие чем плоха постраничная загрузка объектов почему ну почему нельзя использовать постранично загрузку для пример а ленты новостей в социальной сети


[00:53 - 01:08] а дело в том что постраничная загрузка хорошо работает только в том случае когда известно общее число объектов то есть когда вы знаете что под выбранным под указанные условия вот под данный запрос а попадает а


[01:08 - 01:25] ровно 1000 объектов а в таком случае легко разделить их на количество количество там объектов на странице получить пагинации в некоторых случаях посчитать полное количество объектов которые попадут выборку


[01:25 - 01:45] очень тяжело а вот пример немножко надуманной но в принципе принципе мещере как бы пример в реальности а допустим у нас есть блог и нам нужно отображать все посты в порядке их добавления но


[01:45 - 02:04] так чтобы подряд не было более 1 поста из 1 категории в той чтобы у вас рядом 2 поста из 1 и той же категории не находились при этом как правило требует не просто 2 пост отбросить а сделать его таким то какой то маленькой ссылочку


[02:04 - 02:20] но по факту с точки зрения пользователя он будет видеть 10 основных постов а как это реализовать в принципе можно написать запрос которая каким то образом


[02:20 - 02:36] джонни таблице и с агрегируют данные таки а так чтобы а нас на выходе получилось требуемое выборка но скорее всего это запрос будет работать крайне медленно


[02:36 - 02:54] и а потребует загрузить все данные из таблицы что на практике конечно не приемлю поэтому мы не можем построить такой запрос соответственно не можем посчитать количество данных а в нашем случае удобнее загружать данные


[02:54 - 03:11] последовательно то есть небольшими кусочками до тех пор пока не будет загружена необходимое количество то есть нам нужно разобрать прогресс а собственно как мы будем решать такую задачу я предлагаю взглянуть на код


Step 4 (S-44804) 3.png

[03:11 - 03:26] а функция а сразу заметим что этот код который связан с выборкой данных мы разместили в моду менеджер то есть как как предполагается


[03:26 - 03:45] скот это собственной реализации бизнес логики анализаторов кетро требовать поэтому его нужно размещать в моделях мы его разместили в model менеджера который обслуживает модель post это важно а можно было бы написать код во вьюшке но это было


[03:45 - 04:01] был анти паттерн контроллер основная выборка нас представляет собой просто выбор объектов в порядке убывания их идентификатор здесь мы закладываем с на тот факт что


[04:01 - 04:17] идентификаторов объектов идут в порядке увеличения а вообще это не всегда так ну я то в принципе работает мы используем именно сортировку по вентилятором потому что этот секатор проще передавать через


[04:17 - 04:34] а на практике конечно лучше использовать какой то times t в реку а мы получаем кой reset которые соответствуют выборке а всех объектов в порядке убывания их идентификатор


[04:34 - 04:50] создаем временную список для получения результатов то есть а список рез это то что мы вернем а шаблонизатор для отрисовки если нам передан какой то а если нам 1 параметр since


[04:50 - 05:08] мы добавляем дополнительное ограничение что а идентификатор объекта id а должен быть меньше этого условия то есть это позволяет нам вот если грубо говоря так изобразите таблицу от 0 до максимального id шников


[05:08 - 05:26] а вот это параметр since показывают нам что нужно показывать не сверху а с какой то середина то есть начинать выборку не самого начала


[05:26 - 05:46] а 2 части таблицы а если мы накладываем дополнительные ограничения на данный колесов окей в данном случае а запрос в базу еще не было и дальше мы начинаем последовательно перебирать


[05:46 - 06:05] объект из данного horace это причем мы указали здесь ограничение что делаем запрос с ограничением 1000 то есть мы выбираем это вот так с таблице 1000 элементов грубо говоря а


[06:05 - 06:20] так и есть большая площадка если а если у нас массив рез пустой мы добавляем


[06:20 - 06:36] собственно говоря следующий элемент из выборки в него а если у нас массив не пустой мы проверяем что после последней добавленной элемент что его категория отличается от


[06:36 - 06:56] категории а текущего объекта то есть если следующий объект которое мы добавляем а массив у него другая категория то мы его добавляя а за метод опять иначе мы его отбрасывает ну здесь творится что мы можем его уже не отбрасывать добавлять там


[06:56 - 07:14] каким то особым образом то есть в качестве дополнения к предыдущему объект как только мы набрали определенную необходимую длину массива рез мы выходим из цикла и возвращаем а мася что здесь важно


[07:14 - 07:31] а длина массива рез у нас будет не больше чем указанное число то есть не больше чем лимит но при этом перебрать по базе а перед прибрать объектов из базы а возможно придется несколько больше


[07:31 - 07:45] то есть мы возвращаем пользователю 10 объектов о пройти возможно нам пришлось 30 объектов о загружали мы не больше тысяч а собственно говоря это позволяет нам реализовать


[07:45 - 08:04] а выдачу а 1 кусочка для вот нами выборки то есть а в порядке убывания атишникам но без дублирования категории следующий раз мы знаем что у нас есть какой то последний объект который попал


[08:04 - 08:22] выдача result мы возьмем параметр since из него и повтори повтори уже вот вот отсюда теперь каким образом это используется данная выдачи используется а во мне и в шаблоне


[08:22 - 08:37] здесь все довольно просто а вот пример you а мы видим что из того что мой кот вынесли весь ее остался простой и в принципе содержит только в связке что мы делаем


Step 4 (S-44804) 4.png

[08:37 - 08:56] получая параметр since а поскольку они указаны дефолтного значения а используется метод для получения дефолтных значений указано он будет на если если в урле не передано син 180 будет нам


[08:56 - 09:11] далее мы взываем уже реализованный нами метод мы получаем список постов а в отличие от большинства


[09:11 - 09:27] выборок с использованием django models важно понимать что здесь именно действительно список то есть никакой см а именно список list оно то не так критично в данном случае потому что мы будем просто отображать а


[09:27 - 09:46] далее мы вызываем шаблонизатор передаем передаем посты и передаем параметр sims которой совпадает с идентификатором последнего отрисованного нами поста


[09:46 - 10:04] убью довольно простое шаблон еще проще то есть шаблоне а поскольку нас нет сложной структуры пагинации нас есть только 1 кнопка дальше мы можем легко реализовать с помощью гиперссылке примеру так то есть я твой рот которая ведет на данную видюшку


[10:04 - 10:23] параметр сила которая будет совпадать а с параметрах соединения в котором последнего поста а давайте еще раз повторим чего мы достигаем таким подходом с 1 стороны нас получается удовлетворить наши первоначальной хитрый запрос


[10:23 - 10:39] мы можем загружать данные последовательность принципе досмотреть при необходимости до конца страницы а с 3 стороны если мы вернемся к нашему коду а


Step 4 (S-44804) 5.png

[10:39 - 10:56] опечатка а очень важный момент заключается вот здесь ограничения лимит 1000 это означает что мы выбираем из базы ограниченное количество


[10:56 - 11:11] записи причем поскольку мы идет выборка по условия накладываются на поле id это первичный ключ по торговому ничего всегда из индекса то это выборка будет быстрой


[11:11 - 11:23] а фактически она точно затронет не больше 1000 объектов на диске это гарантирует что данный запрос будет работать довольно быстро