django查询集QuerySet分片有两种写法:
第一种:
news = News.objects.all()[1:10]
第二种:
news = News.objects.all()
news = news[1:10]
经测试发现,因为QuerySet是lazy query,如果没有对QuerySet进行实际操作,以上两种写法是完全一样的,打印它们的query就可以看出来。django会生成LIMIT SQL语句。并且切片后的结果仍然是QuerySet。
如果已经对QuerySet进行了实际操作(读、遍历等),那第二种写法会返回list。很明显,此时第二种写法在效率上是不可取的。
结语:可能你会怀疑这种写法是查询完整个数据库表在进行切片操作(比如分页这样显然不可取),你可以用QuerySet.query转化为sql查询语序看看查询过程:
ret = ServerWarningUnrepaired.objects.all().order_by("-start_time")[start:end]
print(ret.query)
打印结果:
发现这就是sql查询条件的limit;看下资料发现就是这个用法,这样用Django进行分页查询就简单很多: