比较Django ORM上关系中的字段

比较Django ORM上关系中的字段,django,django-models,django-orm,Django,Django Models,Django Orm,我有两种型号,route和stop。 一条路线可以有几个站点,每个站点都有一个名称和一个编号。在同一条路线上,站。编号是唯一的 问题是: 我需要搜索哪个路线有两个不同的站点和一个站点。编号小于另一个站点。编号 考虑下面的模型: 以及以下数据: 停止表格 | id | route_id | number | location | |----|----------|--------|----------| | 1 | 1 | 1 | 'A' | | 2 | 1

我有两种型号,
route
stop
。 一条
路线
可以有几个
站点
,每个
站点
都有一个
名称
和一个
编号
。在同一条
路线上
站。编号
是唯一的

问题是: 我需要搜索哪个
路线
有两个不同的
站点
和一个
站点。编号
小于另一个
站点。编号

考虑下面的模型: 以及以下数据: 停止表格

| 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' |
在Django ORM上进行一次查询也可以做到这一点吗?

通常,像Django ORM、SQLAlchemy甚至Hibernate这样的ORM框架并不是为了自动生成最有效的查询而设计的。有一种方法可以只使用模型对象编写此查询,但是,由于我有类似的问题,我建议对更复杂的查询使用原始查询。以下是Django原始查询的链接:

[

虽然,您可以用多种方式编写查询,但下面的内容可能会有所帮助

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
从django.db导入连接
定义我的自定义sql(自我):
使用connection.cursor()作为游标:
cursor.execute(“选择
`路由`.id
从…起
`路线`
在stop\u from上左连接'stop'stop\u from。'route\u id`='route`.'id`
左连接'stop'stop'u to ON stop'u to.'route\u id`='route`.'id`
哪里
停止源。`stop\u location\u id`=%s
和stop\u to.`stop\u location\u id`=%s
和stop_from.stop_number

希望这能有所帮助。

原始查询是我目前的方法,但我认为存在更好的方法来实现这一点。我同意,总有更好的解决方案存在。但是,如果连接模型对象以在对象级别上获取查询,则无法保证ORM(Django ORM或其他ORM)生成一个查询并将其发送到数据库。然而,更重要的是,该查询通常不是最有效的查询。请不要误会,Django ORM是我使用过的最好的ORM之一(与Hibernate一样好),但通常ORM的目标是自动生成查询并将结果转换为不是最有效的查询的对象。
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
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