比较Django ORM关系中的字段

时间:2018-01-10 02:45:59

标签: django django-models django-orm

我有两个模型,routestoproute可以包含多个stop,每个stop都有namenumber。在同一个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”,搜索哪些路线同时包含locationA.number小于B.number

使用之前的数据,它应与route id 1匹配,而不是route id 2

在原始SQL上,这适用于单个查询:

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上的单个查询吗?

1 个答案:

答案 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

希望这会有所帮助。