Queryset的一些注意点
下面以user为models中的一个数据模型
1.可以进行切片操作
user.objects.all()[0:5]
user.objects.all().filter(conditions)[0:2]
2.可以进行迭代
for a in user.objects.all():
print(a.username)
print(a.password)
print(a.user_phone)
3.是惰性查询的
result = user.objects.all()这个时候其实并不会真正的执行SQL语句,只有真正用到的时候才回去执行,比如print(result[0])
4.缓存机制
进行缓存能够减轻数据库的负担,但是对你的内存会有影响,试想如果查询集里面有几十万条数据,一下子全部放到内存中是不是裂开,但是这样我们就不用进行很多次查询了是不是?所以这里面还有很多的学问,比如查询的优化,缓存与查询的权衡。
我们可以result=user.objects.all().filter(conditions)来保存查询结果集,这样就可以避免频繁的执行sql语句,注意:print([u.username for u in user.objects.all()],print([u.password for u in user.objects.all()]),这样的话会进行两次查询并且不会保存结果,血亏
为此我们可以result=user.objects.all(),print([u.username for u in result]),这样就不会进行多余的查询
5.exists和iterator
有时候我们只需要判断查询结果中是否有数据而不需要将数据放入内存中,这时exists就派上用场了if user.objects.all().exists()
iterator,如果数据量非常大的话,我们不想数据一次性装入内存吧,这样内存会裂开,我们可以这样==result=user.objects.all().iterator()==这样的话如果我们for u in result:
print(u.username)就会一次取出一个数据,用完就清除,有点类似与生成器