比较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