2013-01-16 176 views
1

我有以下的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"),以获取所有代表'some place'和'london'之间映射的行。因此,我知道返回的行对我来说可能是好的,如果在'new york '和'某个地方'返回,但不知道如何检查..

回答

2

这是一个图形问题,不是吗?您基本上需要建立一个图,其中节点是您的位置,边是您的映射(其中edge length = mapping.totalTime),然后应用相关的图搜索算法(例如Dijkstra's algorithm)以找到相关的最短路径节点。

虽然没有先从数据库获取所有映射并构建图表,但我认为没有任何方法可以做到这一点。

+0

我不知道很多关于图表,并没有让他们记住,这是只是一个问题,我正在寻找一个中间位置,在两个不直接的位置之间......我会l进入这个图搜索算法,谢谢。 – Zed

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 

注:为了更清楚我没有显示从模型数据的导入,但你的想法

会得到以下输出

All places not linked to new york: 
paris 
amsterdam 
0

谢谢你的建议,我选用先从简单解决方案,这是很不理想,但它会帮助我找到一个更好的way.This就是我现在:

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)