根据django中的条件查找公共元素

Finding common elements based on a condition in django

我通过 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()

给定两个停靠点,我需要 return 一个包含两个停靠点共有的所有路线的查询集,其中第二个停靠点的 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 值过滤它。有谁知道解决这个问题的最佳方法?

在这种情况下我建议 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 更改为实际的 table 名称。

rs_queryRouteStation 个对象,所以你会得到 Route 个带有 rs.route 的对象。