Django模型复杂查询



我有以下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)

最新更新