【发布时间】:2020-12-13 16:28:18
【问题描述】:
我正在使用项目管理应用程序。应用程序需要的一点是创建具有依赖关系的任务的可能性,即任务 2 依赖于任务 1,任务 3 依赖于任务 2 和任务 B,等等。这将生成一个 DAG(有向无环图)。
问题是如何使用 Django 默认的 ORM 来存储这个“图”。
我提供了一个使用多对多关系(Task with self)和触发器来避免创建循环的解决方案,但我仍然不知道如何实现一些操作,例如从单个节点。
有没有人知道如何很好地实现它?例如,这将允许执行关键路径方法的实现。
编辑:
使用@Daniel 提出的解决方案,我最终得到了以下功能。我们可以看到,为了获得整个图,对数据库进行了多次调用。此函数在循环期间也会进入无限循环。
def get_task_graph(task, visited_nodes = [], graph = {}):
# Visited nodes are nodes that all parents were visited
# print(task)
previous_tasks = task.previous_tasks.all()
still_have_unmarked_parents = set(previous_tasks).difference(set(visited_nodes))
if still_have_unmarked_parents:
print(f"Task {task} still have unmarked parents")
for previous_task in still_have_unmarked_parents:
visited_nodes, graph = get_task_graph(previous_task, visited_nodes=visited_nodes, graph=graph)
next_tasks = task.next_tasks.all()
visited_nodes.append(task)
print(f"Marking {task} as visited")
graph[task] = []
for next_task in next_tasks:
if next_task not in graph[task]:
graph[task].append(next_task)
visited_nodes, graph = get_task_graph(next_task, visited_nodes=visited_nodes, graph=graph)
print(f"\t Adding {next_task} to {task}")
return visited_nodes, graph
谢谢
【问题讨论】:
标签: python sql django database orm