2017-07-18 54 views
2

我有三個通過m2m關係連接的模型。 Stop代表公共汽車站,Route代表公交車路線,並且RouteStation是將停靠點和路線連接到彼此的中間模型,並提供有關停靠點在路線上的位置的信息(RouteStation.order)。根據django中的條件查找公共元素

class Stop(models.Model): 
    lat = models.FloatField() 
    lon = models.FloatField() 
    name = models.CharField(max_length=250, blank=True, default="None") 
    stop_id = models.IntegerField(unique=True) 


class Route(models.Model): 
    route_id = models.CharField(max_length=20) 
    journey_pattern = models.CharField(max_length=20) 
    stops = models.ManyToManyField(Stop, through="RouteStation") 


class RouteStation(models.Model): 
    stop = models.ForeignKey(Stop, on_delete=models.CASCADE) 
    route = models.ForeignKey(Route, on_delete=models.CASCADE) 
    order = models.IntegerField() 

考慮到兩站路,我需要返回包含常見的兩種停止,其中RouteStation.order的值是第二站比第一高的所有路由的查詢集。這種情況可確保通過該路線上的第一站可以訪問第二站。

我可以使用下面找到常見站:

stop1 = Stop.objects.get(stop_id=origin) 
stop2 = Stop.objects.get(stop_id=destination) 

routes1 = stop1.route_set.all() 
routes2 = stop2.route_set.all() 
common = routes1 & routes2 

但是我無法過濾此基礎上RouteStation.order值。有沒有人知道去做這件事的最好方法?

+0

??那麼你需要Route中的stops字段嗎?多對多由RouteStation模型實施 – mbieren

+0

這是一個專業的網站嗎?你是否被聘請爲一些公共交通服務製作一個真實的網站,或者你是在「搞亂」?無論哪種方式,我都強烈建議查看「Dijkstra的算法」,並花費大量時間思考和理解主題。當這需要適當地處理它的某些QueryFiltering沒有完成時,您需要構建一個大規模算法。當你爲自己做這件事時,喜歡併發布我想看到的結果:D。如果你做這個廣告,我會建議購買一個令人興奮的項目並實施它。 – hansTheFranz

+0

@hansTheFranz這是一個大學項目。我們正在構建一個公共交通應用程序,並對歷史交通數據使用一些簡單的機器學習來改進時間表預測。如果您有興趣,我可以向您發送我的其他代碼! –

回答

0

在這種情況下,我會建議performing raw SQL queries,因爲使用Django orm比需要更復雜。

sql = ''' 
SELECT * FROM yourapp_routestation r1, yourapp_routestation r2 
WHERE r1.stop_id = {s1} AND 
    r2.stop_id = {s2} AND 
    r1.route_id = r2.route_id AND 
    r1.order < r2.order 
''' 

rs_query = RouteStation.objects.raw(sql.format(s1=stop1.stop_id, s2=stop2.stop_id)) 
for rs in rs_query: 
    print(rs.route_id) 

注:

更改yourapp_routestation實際的表名。

rs_queryRouteStation對象,所以你會得到Route對象rs.route

+0

嘿,非常感謝!我沒有意識到你可以在Django中使用原始SQL進行查詢。但是,因爲我指的是直接在我的RouteStation模型中停止和路由對象,所以我不確定使用route_id是否正確訪問模型。你如何引用像使用SQL的其他對象? –

+0

道歉,我上面編輯了我的評論。如果在一個單獨的線程中詢問第二個問題會更合適,我將標記問題的答案並製作另一個線程。再次感謝您的幫助:) –

+0

@DanielJ看到[this](https://docs.djangoproject.com/en/1.11/ref/models/fields/#database-representation)。簡而言之,對於'ForeignKey'字段,django自動將'_id'附加到數據庫列名稱。因此'RouteStation'模型中的'stop'字段在數據庫的'yourapp_routestation'表中表示爲'stop_id'列。檢查您的實際數據庫表以查看它的實際運行情況。 :) – azalea