django - 如何将此 SQL 查询“翻译”为 django 中的查询集
问题描述
所以我有了这些 Django 模型(顺便简化了代码):
class Travel(models.Model):
#there are many other fields
origin_city = CharField()
end_city = CharField()
class Segment(models.Model):
start_time = DateTimeField()
origin = CharField()
end = CharField()
travel = ForeignKey(Travel)
price = IntegerField()
所以一次旅行有一组路段,例如如果旅行是 A->B->C->D->E,那么路段是 (A,B) , (B,C) , (C,D)和(D,E)。在给定起点和终点的情况下,我想获得通过给定起点然后通过给定终点的行程。例如,如果起点和终点是 (B,D),则示例行程是有效的,因为它在某个时间点经过 B,然后再经过 D,但它对 (D,B) 无效。
我知道在 SQL 中,可以这样完成(假设旅行商店 id 和段具有外键限制):
SELECT t.*
FROM travel as t, segment as s1,segment as s2
WHERE t.id = s1.travel_id AND t.id = s2.travel_id
AND s1.origin = (user given origin)
AND s2.end = (user given end)
AND s1.start_time < s2.start_time
解决方案
以下查询应该让您到达那里,user_origin
并user_end
作为用户提供的条件:
travels = (Travel.objects
.filter(segment__origin=user_origin)
.annotate(origin_time=F('segment__start_time'))
.filter(segment__end=user_end, segment__start_time__gt=F('origin_time'))
)
您获取对start_time
第一个连接的引用Segment
,并在filter()
创建第二个连接的第二个中引用它Segment
。
推荐阅读
- piranha-cms - 自定义块图标未出现
- c# - 使用部分文本提取整行文本
- python - 从文件夹循环读取 Panda 中的 .dat 文件的问题
- progressive-web-apps - 如何将我的服务工作人员工作设置为 cloudflare 的工作人员?
- python-3.x - 如何从具有不同总和数据组的数据框在条形图顶部添加百分比标签
- javascript - Caesars Cipher,这是一个 freeCodeCamp 编码挑战
- python - 如何根据行和列的值更改 PySpark Dataframe 的大小和分布?
- python - 如何每天在特定列上聚合函数
- c++ - 将IP地址转换为二进制
- c - vs代码调试器(lldb)不显示正确的值