询问一个关于 Django 查询方面的问题,请赐教

2016-07-21 15:17:49 +08:00
 hao1032
class Car(models.Model):
type = models.CharField(max_length=20) # 可能的值 出租车,卡车,轿车

假设我有上面这个 model ,表里面有 30000 条数据,出租车,卡车,轿车各不少于 1000 条。

我现在有一个需求查询出租车,卡车,轿车各 100 条数据,我现在的做法是使用 3 个查询,如下:
q = Car.objects
cz = q.filter(type='出租车')[: 100]
kc = q.filter(type='卡车')[: 100]
jc = q.filter(type='轿车')[: 100]

以上是举例,实际 type 有 20 多个,这种单个查询影响了效率。

请问大神, Django 中有没有办法经过一次查询操作,就能满足上述需求呢?
需求:一次查询的结果中包含多个 type ,每个 type 有 100 个结果。
2584 次点击
所在节点    Python
10 条回复
28ms
2016-07-21 16:06:51 +08:00
用 raw sql 查比较方便
stargazer
2016-07-21 18:10:51 +08:00
raw +1
petelin
2016-07-21 18:33:00 +08:00
raw+1 有些东西真的不能一次搞出来,必须得自己写
hao1032
2016-07-21 22:45:16 +08:00
@28ms @petelin @petelin 大家说的 raw 指的是用 union all 吗?
petelin
2016-07-21 23:04:08 +08:00
@hao1032 应该是直接拼接 sql 语句吧,这个有点类似于分组取每组 top100
Allianzcortex
2016-07-22 08:58:04 +08:00
我也感觉直接拼, 上原生 sql,Google 上搜“ django model select different type ”没有什么太好的结果
wph95
2016-07-22 10:14:25 +08:00
types = [car, taxx ...]
cars = Car.objects.filter(types_in=types)
dict = {}
for type in types:
dict[type] = []
for car in cars:
dict[car.type].append(car)
glasslion
2016-07-22 10:20:46 +08:00
@hao1032 mysql 以外的的 RDMS 可以用 window function
hao1032
2016-07-22 14:09:02 +08:00
@wph95 项目有 12w 数据且分布不定。这样的的做法效率也不高。
hao1032
2016-07-22 14:10:48 +08:00
All 感谢大家的回复,最终决定新建立一个表,里面只保存各 type 最近的 100 个结果。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/293956

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX