sim3x: как мы делаем, добавляем в модель интовое поле order, которое по умолчанию специализируется одним значением допустим 1000, оно не уникально и у разных записей может совпадать, выбираем второе поле по которому будет осуществляться сортировка в случае если поле order одинаковое, в данном случае name.
Прописываем при необходимости поля в Meta.ordering
И собственно всё, появилась необходимость переместить некую запись в самое начало, открыли админку поменяли значение поля order, код при этом не меняется.
>SELECT keyword, count(keyword) as count FROM core_entry WHERE keyword LIKE '%something%';
как понимаю тут group by пропущен?
а какая еврсия постгре у вас? Поскольку мне при всём желании не удалось аналогичном запросе сделать(postgre9.4) так чтоб индекс не использовался.
И на всякий случай analize у вас по этой табличке давно происходил?
под условие автора подходит второй вариант, но это плохой вариант, жесткий хардкод данных из бд в форме, потребуется сделать в начале другую страну придётся лезть в код, потребуется сделать несколько стран в начале придётся лезть код, при это никаких гарантий что таже Россия в писке стран есть нет, и нет гарантий что название в бд не поменяется..
Гораздо правильнее добавить интовое поле с сортировкой, и сортировать по двум полям по имени и этому полю.
после двух курсов института, где получил самые первые представления о программировании, я летом не пошел никуда работать, а в течении пары месяцев по 10 часов в день писал программу "за которую не стыдно", это были бесконечные хождения в интернете тогда ещё по диалапу. за эти 2 месяца я узнал больше чем за 2 года института. Стал ли я после этого готов у реальной разработке, да ниразу, это был только самый первый шаг.
Берите реальные задачи, и пробуйте не просто написать код который решает задачу(это как правило самое простое), а код за который не стыдно.
nirvimel: https://ideone.com/vZoNIc в вашем варианте заменил генератор списка на генератор, а в варианте angru zip на izip (раз речь о втором питоне), для более корректного сравнения.
Также понял, что использование tee всётки необходимо, дело в том что даже если на вход подать итератор, то tee от итератора вернёт разные итераторы. https://ideone.com/Qi9aBB
angru: и правда не надо, итераторы и сами по себе возьмутся.
з.ы. do not assign a lambda expression ^^
з.з.ы. seq наверно тоже не совсем подходит, тут достаточно просто возможности итерироваться, а чтоб объект подходил под collections.Sequence требуется гораздо больше ограничений
MIsternik: фактически совокупность выбираемых таблиц и условий говорит, что в t ,будут только записи содержащие 'aa', в t2 только записи содержащие 'bb', потом соединяем их, если бы был простой джойн то у нас остались бы только записи у которых есть как 'aa' так и 'bb', но так как у нас left, то в выборке у нас будут и записи у которых есть 'aa' но нет 'bb', и именно эти записи выбираем посредством t2.Tag_id is NULL
з.ы. если использовать "ответить" то соответствующий пользователь получит уведомление ^^
MIsternik: ну вот потому что не понимаете, у вас и не получается решить самому. Ключевые особенности что это именно left join и использовании t2.Tag_id is NULL.
>Если это простой контейнер (как список, кортеж, словарь, множество или определенный пользователем), Python преобразует его в итератор. Если этот объект уже является итератором, Python использует непосредственно его.
Не совсем так, объект является интегрируемым если у него есть метод __iter__, объект является итератором если он является итерируемым и у него есть метод next или __next__.
Питоне не проверяет находится перед ним итератор или нет, он просто забирает итератор объекта (вызов метода __iter__), просто обычно (но не обязательно) вызов этого метода у итератора возвращает его самого.
Syschel: неа, главный плюс системы с left, right это возможность от нерутовой ноды получить всех его потомков (что как я отметил мне неособо и нужно), но при этом в случае если дерево активно меняется, то в самом плохом случае вставка или удаления элемента в одной из ветвей, может привести к необходимости персчёта этих двух параметров во всём дереве, в том что я описал такого не происходит, обновляется только то что требует обновления.
При это я ещё могу явно задавать сортировку элементов в рамках одного уровня, что для меня является крайне важным.
Собственно есть табличка информация в которой обновляется раз в минуту, и соответственно перестраивается топология элементов.
Уровней вложенности не более пары десятков
На одном уровне вложенности не бывает больше 1000 элементов.
Корневой элемент - собственно то что находится на вершине дерева, нам надо быстро и просто выбрать всё что является для него дочерними элементами.
Нет необходимости для дочернего получать список дочерних, что является серьёзным послаблением, и облегчает реализацию.
Дальше всё просто
у каждого элемента есть несколько полей:
root_id - ссылка на корневой элемент, у самого корневого она равна самому себе.
parent_id - объект который является родительским для текущего.
lvl - уровень на котором находится элемент.
index - некое вспомогательное поле, характеризующее положение элемента среди элементов одного уровня от одного родителя, не обязательно идут по порядку.
order - специальное поле для сортировки, построенное на основе index, используется для выборки из бд, позволяя отсортировать элементы в нужном мне порядке вывода, тоесть сразу получаю элементы с нужным позированием для вывода, и соответственно при выводе на страницу, мне не требуется рекурсивный разбор дерева, всё сразу в нужном виде, при этом поле ориентировано на обратную сортировку DESC, сделано специально, чтобы размещать новые события выше в топологии, и соответственно при появлении новых объектов на текущем уровне топологии в текущем родителе, я просто увеличиваю делаю индекс больше чем есть у текущих элементов, а не переписываю его у уже существующих элементов в дереве.
пример как выглядят заполненные поля, и уже отсортированные по полю order: pastebin.com/HKiV2zYQ
Смысл в символах "." и ":" участвующих в поле order, то что у одного код символа больше чем у чисел, а у другого меньше.
Собственно один раз отладил, работает как часы.
Прописываем при необходимости поля в Meta.ordering
И собственно всё, появилась необходимость переместить некую запись в самое начало, открыли админку поменяли значение поля order, код при этом не меняется.