我有三个模型通过m2m关系连接。 Stop表示公共汽车站,Route表示公共汽车路线,RouteStation是连接Stop和Route的中间模型,有关该站点在路线上的位置的信息(RouteStation.order)。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
给定两个停靠点,我需要返回一个查询集,其中包含两个停靠点共有的所有路由,其中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值过滤时遇到问题。有谁知道最好的解决方法?
答案 0 :(得分: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_query
是RouteStation
个对象,因此您将获得Route
rs.route
对象。