Найти - Пользователи
Полная версия: Работа с деревьями/графами
Начало » Django » Работа с деревьями/графами
1
Enchantner
Нужно мне организовать из моделей структуру в виде сложного графа со связями. Причем каждая нода должна обладать кроме некоторого количества детей и родителей еще и разграничением прав на редактирование, для каждого пользователя свои права.

Я примерно представляю, как можно сделать права - можно создать параллельно с Node отдельную модель вроде NodeRights с полями can_add, can_modify, can_delete и внешним ключом на юзера, но как реализовать такую структуру с графом? Обычно такие вопросы решаются внешним ключом на себя, однако, и детей, и родителей может быть довольно много…

P.S, И да, циклы возможны, но между двумя нодами только одна связь
maxwell
Enchantner, если я правильно вас понял, то если у узла только одна связь — то и родитель у него только один.
NodeRights тогда:
node_id
user_id
permissions

Так же следует понимать и корректно удалять «детей» узла — пользователь может иметь право удалить узел, но, что если ему запретили удалять конкретного «ребёнка» этого узла? И тд. и тп.
Enchantner
maxwell
Я имел в виду, что между двумя конкретными нодами только одна связь :) а так - родителей и детей может быть много… Тут смысл не столько в иерархии, сколько в том, чтобы потом можно было создать несколько таких деревьев и смержить их в одно.

А нода будет в таком случае вести себя как переменная в C++. Пока у нее есть хоть одна связь - она будет существовать. Поэтому удаление ноды не подразумевает удаление соседних, а только удаление связей с соседними.

АПД: хотя, по логике, можно просто сделать связь отдельным объектом, как промежуточную таблицу, и хранить в нем пары внешних ключей на какие-либо две ноды. Тогда и мержить проще будет…
maxwell
Enchantner, Merge по каким критериям то будет вестись? По-моему это напрямую зависит от иерархии (читать: как мы этот самый граф создаем).
Enchantner
maxwell
Тут проблема в том, чтобы заресолвить права пользователей после объединения двух деревьев… А мержиться деревья будут по нодам, у которых совпадают какие-то параметры.

С нодами получается эдакий ManyToManyField на себя. Только суррогатный.
class TreeNodeLink(models.Model):
left = models.ForeignKey(TreeNode, related_name='left')
right = models.ForeignKey(TreeNode, related_name='right')
OZION
http://habrahabr.ru/blogs/python/112421/
мб поможет.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB