【发布时间】:2017-07-03 04:32:50
【问题描述】:
这主要是一个逻辑问题,但上下文是在 Django 中完成的。
在我们的数据库中,我们有顶点和线类,它们形成了一个(神经)网络,但它是无序的,我无法更改它,它是一个遗留数据库
class Vertex(models.Model)
code = models.AutoField(primary_key=True)
lines = models.ManyToManyField('Line', through='Vertex_Line')
class Line(models.Model)
code = models.AutoField(primary_key=True)
class Vertex_Line(models.Model)
line = models.ForeignKey(Line, on_delete=models.CASCADE)
vertex = models.ForeignKey(Vertex, on_delete=models.CASCADE)
现在,在应用程序中,用户将能够直观地选择两个顶点(下面的绿色圆圈)
javascript然后将这两个顶点的pk发送给Django,它必须找到满足它们之间路由的Line类,在这种情况下,以下4个红色Lines:
业务逻辑:
- 一个顶点可以有 1-4 行与之相关
- 一条线可以有 1-2 个与之相关的顶点
- 两个顶点之间只有一种可能的路线
到目前为止我所拥有的:
- 我知道答案可能包括递归
- 必须通过从一个顶点到找到另一个顶点的每条路径都尝试找到该路径,无法直接找到它
- 由于有四路和三路交叉点,因此在整个递归过程中必须保存所有尝试的路线(不确定这一点)
我知道基本逻辑是循环遍历每个 Vertex 的所有行,然后获取这些行中的另一个 Vertex,并继续递归地走,但我真的不知道从哪里开始。
这是我所能得到的,但它可能没有帮助(views.py):
def findRoute(request):
data = json.loads(request.body.decode("utf-8"))
v1 = Vertex.objects.get(pk=data.get('v1_pk'))
v2 = Vertex.objects.get(pk=data.get('v2_pk'))
lines = v1.lines.all()
routes = []
for line in lines:
starting_line = line
#Trying a new route
this_route_index = len(routes)
routes[this_route_index] = [starting_line.pk]
other_vertex = line.vertex__set.all().exclude(pk=v1.pk)
#There are cases with dead-ends
if other_vertex.length > 0:
#Mind block...
【问题讨论】:
标签: python django recursion django-models logic