我有两个模型,route
和stop
。
route
可以包含多个stop
,每个stop
都有name
和number
。在同一个route
上,stop.number
是唯一的。
我需要搜索哪个route
有两个不同的stops
,一个stop.number
小于另一个stop.number
class Route(models.Model):
name = models.CharField(max_length=20)
class Stop(models.Model):
route = models.ForeignKey(Route)
number = models.PositiveSmallIntegerField()
location = models.CharField(max_length=45)
停止表
| id | route_id | number | location | |----|----------|--------|----------| | 1 | 1 | 1 | 'A' | | 2 | 1 | 2 | 'B' | | 3 | 1 | 3 | 'C' | | 4 | 2 | 1 | 'C' | | 5 | 2 | 2 | 'B' | | 6 | 2 | 3 | 'A' |
给定两个位置“A”和“B”,搜索哪些路线同时包含location
和A.number
小于B.number
使用之前的数据,它应与route id 1
匹配,而不是route id 2
SELECT
`route`.id
FROM
`route`
LEFT JOIN `stop` stop_from ON stop_from.`route_id` = `route`.`id`
LEFT JOIN `stop` stop_to ON stop_to.`route_id` = `route`.`id`
WHERE
stop_from.`stop_location_id` = 'A'
AND stop_to.`stop_location_id` = 'B'
AND stop_from.stop_number < stop_to.stop_number
这也可以用于Django ORM上的单个查询吗?
答案 0 :(得分:0)
一般来说,像Django ORM,SQLAlchemy甚至Hibernate这样的ORM框架都不能自动生成最有效的查询。有一种方法只使用Model对象编写此查询,但是,由于我有类似的问题,我建议使用原始查询进行更复杂的查询。以下是Django原始查询的链接:
[https://docs.djangoproject.com/en/1.11/topics/db/sql/]
虽然,您可以通过多种方式编写查询,但以下内容可能有所帮助。
from django.db import connection
def my_custom_sql(self):
with connection.cursor() as cursor:
cursor.execute("SELECT
`route`.id
FROM
`route`
LEFT JOIN `stop` stop_from ON stop_from.`route_id` = `route`.`id`
LEFT JOIN `stop` stop_to ON stop_to.`route_id` = `route`.`id`
WHERE
stop_from.`stop_location_id` = %s
AND stop_to.`stop_location_id` = %s
AND stop_from.stop_number < stop_to.stop_number", ['A', 'B'])
row = cursor.fetchone()
return row
希望这会有所帮助。