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

时间:2017-07-18 15:21:22

标签: python django orm django-orm

我有三个模型通过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值过滤时遇到问题。有谁知道最好的解决方法?

1 个答案:

答案 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_queryRouteStation个对象,因此您将获得Route rs.route对象。