Django模型复杂查询

时间:2013-01-16 10:55:26

标签: python 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 - paris没有直接连接。因此,返回的表行应该是

new york        london        03:55
london          paris         22:33

任何想法如何? 我开始使用Mappings.objects.filter(placeTo="london")来获取代表'some place'和'london'之间映射的所有行。所以我知道返回的行对我来说可能是好的,如果有一个映射'纽约'和'某个地方'回来了,但不知道怎么检查..

3 个答案:

答案 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)