根据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_query
是 RouteStation
个对象,所以你会得到 Route
个带有 rs.route
的对象。
我通过 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_query
是 RouteStation
个对象,所以你会得到 Route
个带有 rs.route
的对象。