Есть некая модель (сотни тысяч записей)
Во вьюхе мы получаем некую выборку (куча наложенных фильтров друг на друга) модели (скажем с десяток тысяч с пагинацией)
Есть пользователь, которому выводятся инстансы этой модели в виде карточек.
Пользователь меняет порядок выводимых карточек у себя на рабочем столе. И сохраняет порядок.
Теперь в любой выборке если эти карточки попадают в выборку, они должны выводиться в порядке, в котором расположил их пользователь. Если он поставил некую карточку первой - то при попадании в любую выборку она должна выдаваться первой.
Вопрос - как организовать порядок вывода карточек для пользователя без падения производительности при выборке.
Встречный вопрос:
Пользователь наложил первый десяток фильтров, получил некую выборку, взял рандомную карточку и поставил её первой.
Далее пользователь наложил другие фильтры и получил уже другую выборку, где нет той самой карточки, которую он переставил. Он берёт опять рандомную карточку и ставит её опять на первое место.
Вопрос:
Какая карточка будет первой в общей выборке?
Написано
Владимир Куц
@fox_12 Автор вопроса, куратор тега Django
Roman Kitaev: вот как раз в этом одна из сложностей. В новой выборке карточки поставленные первыми должны быть вверху - одна естественно становится первой, другая - второй в данной выборке в этом случае порядок не так важен. Но они обе должны быть в начале выборки. То есть в новой выборке - расставляем все первые карточки, затем все вторые, и так далее. Когда закончились отсортированные - выводим все остальные.
Сотни тысяч? Как это интересно в браузер то вывести, он уже при 1000 дивов тупить начинает.
Написано
Владимир Куц
@fox_12 Автор вопроса, куратор тега Django
un1t: про постраничный вывод слышали? Я нигде в вопросе и не собирался все это вместе на странице выводить. На практике ничего не тупит при количестве записей более полумиллиона. Именно поэтому интересует возможность сортировки, которая не убила бы производительность в данном случае.
Владимир Куц
@fox_12 Автор вопроса, куратор тега Django
Хорошо. У меня в переменной q содержится queryset с уже наложенными фильтрами, какой шаг мне нужно проделать, чтобы наложить на него результат пользовательской сортировки?
Владимир Куц: и что?
У тебя два запроса пойдет
Один по твоим тысячам, а второй по списку ид для твоего пользователя
Тебе НЕ нужно все запихивать в один запрос
Написано
Владимир Куц
@fox_12 Автор вопроса, куратор тега Django
sim3x: но мне не нужно фильтровать - мне нужно чтобы айтемы всплыли в порядке, заданном пользователем, для айтемов, которые существуют в CustomBullshit (там третье поле в модели должно быть - position) Можно конечно в крайнем случае их просто помечать, как у вас в примере, но хотелось бы именно сортировки. И сделать это без перебора отфильтрованного списка.
Владимир Куц: переформулируй вопрос - что пользователь может указать в виде порядковго номера для особой карточки?
Написано
Владимир Куц
@fox_12 Автор вопроса, куратор тега Django
sim3x: пользователь накладывает фильтр, делает выборку, просматривает карточки. Некоторые он берет и перемещает в начало. Затем накладывает другой фильтр, если карточки уже были им отобраны - они всплывают в в начале выборки в том порядке, в котором их разместил пользователь в предыдущих итерациях (они могут попадать в выборку, а могут фильтроваться). То есть в результате выборки мне нужно учесть порядок сортировки карточек, заданных пользователем. Сделать это по возможности наименьшим количеством запросов к базе и наименьшей тратой памяти (выборки и фильтры - очень "тяжелые")
Написано
Владимир Куц
@fox_12 Автор вопроса, куратор тега Django
sim3x:Переместить в начало карточку он может на первое место (типа очень важная), а может на любое другое
Владимир Куц: делаешь два запроса с фильтрами и сортировками для общей кучи и для кучи пользователя, а потом во вью соединяешь их в цикле
Написано
Владимир Куц
@fox_12 Автор вопроса, куратор тега Django
sim3x: Как-то тяжеловато... - мне нужно из первого запроса исключить элементы второго... А вывод данных у меня там постраничный..., если во вьюхе полный цикл по данным пробегать - у меня система умрет :) Нужно каким-то образом лепить тогда костыль с пагинацией.
Владимир Куц: исключить из выборки - быстра задача
к обеим выборкам сразу применить фильтр пагинации
потом совместить 10 и 10 итемов
если при таком твоя система умрет, то что-то тут не так
Написано
Владимир Куц
@fox_12 Автор вопроса, куратор тега Django