Форум сайта python.su
Нужно мне организовать из моделей структуру в виде сложного графа со связями. Причем каждая нода должна обладать кроме некоторого количества детей и родителей еще и разграничением прав на редактирование, для каждого пользователя свои права.
Я примерно представляю, как можно сделать права - можно создать параллельно с Node отдельную модель вроде NodeRights с полями can_add, can_modify, can_delete и внешним ключом на юзера, но как реализовать такую структуру с графом? Обычно такие вопросы решаются внешним ключом на себя, однако, и детей, и родителей может быть довольно много…
P.S, И да, циклы возможны, но между двумя нодами только одна связь
Отредактировано (Янв. 24, 2011 16:39:24)
Офлайн
Enchantner, если я правильно вас понял, то если у узла только одна связь — то и родитель у него только один.
NodeRights тогда:
node_id
user_id
permissions
Так же следует понимать и корректно удалять «детей» узла — пользователь может иметь право удалить узел, но, что если ему запретили удалять конкретного «ребёнка» этого узла? И тд. и тп.
Офлайн
maxwell
Я имел в виду, что между двумя конкретными нодами только одна связь :) а так - родителей и детей может быть много… Тут смысл не столько в иерархии, сколько в том, чтобы потом можно было создать несколько таких деревьев и смержить их в одно.
А нода будет в таком случае вести себя как переменная в C++. Пока у нее есть хоть одна связь - она будет существовать. Поэтому удаление ноды не подразумевает удаление соседних, а только удаление связей с соседними.
АПД: хотя, по логике, можно просто сделать связь отдельным объектом, как промежуточную таблицу, и хранить в нем пары внешних ключей на какие-либо две ноды. Тогда и мержить проще будет…
Отредактировано (Янв. 24, 2011 17:46:47)
Офлайн
Enchantner, Merge по каким критериям то будет вестись? По-моему это напрямую зависит от иерархии (читать: как мы этот самый граф создаем).
Офлайн
maxwell
Тут проблема в том, чтобы заресолвить права пользователей после объединения двух деревьев… А мержиться деревья будут по нодам, у которых совпадают какие-то параметры.
С нодами получается эдакий ManyToManyField на себя. Только суррогатный.
class TreeNodeLink(models.Model):
left = models.ForeignKey(TreeNode, related_name='left')
right = models.ForeignKey(TreeNode, related_name='right')
Отредактировано (Янв. 24, 2011 17:57:58)
Офлайн
Офлайн