【发布时间】:2017-12-23 13:40:06
【问题描述】:
我通过 m2m 关系连接了三个模型。 Stop 代表一个公共汽车站,Route 代表一个公共汽车路线,RouteStation 是一种将 Stop 和 Route 相互连接起来的中间模型,其中包含有关该站在路线上的位置的信息 (RouteStation.order)。
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 值过滤它。有谁知道最好的解决方法?
【问题讨论】:
-
??那么您是否需要路线中的停靠点字段。无论如何,多对多是由 RouteStation 模型实现的
-
这是一个专业的网站吗?就像您是受雇为某些公共交通服务制作一个真实的网站还是您在“胡闹”?无论哪种方式,我都强烈建议您研究“Dijkstra 算法”并花大量时间思考和理解该主题。当这需要正常工作而不是通过某些 QueryFiltering 完成时,您需要构建一个庞大的算法。当您为自己这样做时,请享受并发布我想看到的结果:D。如果你做这个广告,我建议你购买一个令人兴奋的项目并实施它。
-
@hansTheFranz 这是一个大学项目。我们正在构建一个公共交通应用程序,并对历史交通数据使用一些简单的机器学习来改进时间表预测。如果你有兴趣,我可以把我剩下的代码发给你!
标签: python django orm django-orm