我有以下django模型:
class Mappings(models.Model):
placeFrom = models.CharField(max_length=50)
placeTo = models.CharField(max_length=50)
totalTime = models.TimeField()
以下是表格的填充方式:
placeFrom placeTo totalTime
new york london 03:55
london paris 22:33
london new york 03: 23
amsterdam london 82:39
我们的想法是找到没有直接连接的映射的所有数据库行。例如,在这种情况下,new york - paris没有直接连接。因此,返回的表行应该是
new york london 03:55
london paris 22:33
任何想法如何?
我开始使用Mappings.objects.filter(placeTo="london")
来获取代表'some place'和'london'之间映射的所有行。所以我知道返回的行对我来说可能是好的,如果有一个映射'纽约'和'某个地方'回来了,但不知道怎么检查..
答案 0 :(得分:2)
这是一个图形问题,不是吗?你基本上需要建立一个图形,其中节点是你的位置,边缘是你的映射(边长度= mapping.totalTime),然后应用相关的图搜索算法(例如Dijkstra's algorithm)来找到最短的相关节点之间的路径。
我认为,如果没有首先从数据库中获取所有映射并构建图形,我认为没有办法做到这一点。
答案 1 :(得分:2)
您需要做一些事情,比如您可以在哪里建立路线并轻松拉出哪些位置(或节点)没有连接。完成后,您需要遵循@DanielRoseman建议并使用图搜索算法来填补空白
import networkx as nx
G = nx.DiGraph()
G.add_node('new york')
G.add_node('london')
G.add_node('paris')
G.add_node('amsterdam')
G.add_edge('new york', 'london', weight=235)
G.add_edge('london', 'paris', weight=1353)
G.add_edge('london', 'new york', weight=203)
G.add_edge('amsterdam', 'london', weight=4959)
print 'All places not linked to new york:'
for location in nx.non_neighbors(G,'new york'):
print location
n.b。为了更清楚,我没有显示从模型导入数据,但你明白了
您获得以下输出
All places not linked to new york:
paris
amsterdam
答案 2 :(得分:0)
感谢您的建议,我选择从简单的解决方案开始,这远非理想,但它会帮助我找到更好的方法。这就是我现在所得到的:
querySetToEndLocation = Mappings.objects.filter(placeTo="london")
toEnd = []
toMiddle = []
for row in querySetToEndLocation:
locationFrom = row.placeFrom
queryNew = Mappings.objects.filter(placeFrom="new york")
for rowquery in queryNew:
if locationFrom == rowquery.placeTo:
toEnd.append(row)
toMiddle.append(rowquery)