我有以下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 london 03:55
london paris 22:33
知道怎么做吗?我从使用Mappings.objects.filter(placeTo="london")
开始,得到所有表示"某个地方"one_answers"伦敦"之间映射的行。所以,我知道返回的一行对我来说可能是好的,如果在" new york "one_answers" someplace "之间有一个映射返回,但不知道如何检查。
这是一个图形问题,不是吗?你基本上需要建立一个图,其中节点是你的位置,边是你的映射(边长度= mapping.totalTime),然后应用相关的图搜索算法(例如Dijkstra的算法)来找到相关节点之间的最短路径。
我认为如果不首先从数据库中获取所有映射并建立图形,则没有任何方法可以做到这一点。
您需要做一些事情,例如您可以在哪里建立路由并轻松地提取未连接的位置(或节点)。一旦完成,你需要遵循@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
的被害者。为了更清楚地说明,我没有展示从模型导入数据的过程但是您可以理解
得到以下输出
All places not linked to new york:
paris
amsterdam
谢谢你的建议,我选择从简单的解决方案开始,这离理想还很远,但它会帮助我找到更好的方法。这是我现在得到的:
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)