【问题标题】:Finding common elements based on a condition in django根据 django 中的条件查找公共元素
【发布时间】: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


【解决方案1】:

在这种情况下,我建议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 对象,因此您将获得带有 rs.routeRoute 对象。

【讨论】:

  • 嘿,非常感谢!我没有意识到您可以在 Django 中使用原始 SQL 进行查询。但是,因为我在 RouteStation 模型中直接引用 Stop 和 Route 对象,所以我不确定使用 route_id 是否正确访问模型。你如何使用 SQL 引用其他类似的对象?
  • 抱歉,我在上面编辑了我的评论。如果在单独的线程中提出第二个问题更合适,我将标记已回答的问题并制作另一个线程。再次感谢您的帮助:)
  • @DanielJ 见this。简而言之,对于ForeignKey 字段,django 会自动将_id 附加到数据库列名。因此,RouteStation 模型中的 stop 字段在数据库的 yourapp_routestation 表中表示为 stop_id 列。检查您的实际数据库表以查看它的运行情况。 :)
  • 谢谢!当我在我的 Stop 和 Route 模型中明确使用 stop_id 和 route_id 时,我感到很困惑。我现在看到这些与 Django 自己生成的 stop_id 和 route_id 字段不同。再次感谢。
猜你喜欢
  • 2017-07-21
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多