经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
django 中QuerySet特性功能详解
来源:jb51  时间:2019/7/25 11:00:56  对本文有异议

Book表的数据显示

  1. id title   price publish_id
  2. 2 Linux   30    1
  3. 3 项塔兰   45    2
  4. 4 追风筝的人 39.9 3
  5. 5 富爸爸   23 10

创建queryset 视图 函数, 可以使用的列表的方法,按索引,切片的方法取值,得到一个列表对象

  1. def queryset(request):
  2.  
  3. ret1 = Book.objects.all()[0]  #QuerySet支持索引,切片操作
  4. # print(ret1) #linux 得到一个具体的对象
  5. ret2 = Book.objects.all()[1:3]
  6. # print(ret2)#<QuerySet [<Book: 项塔兰>, <Book: 追风筝的人>]>
  7. # ret3 = Book.objects.all()[:2]
  8. ret4 = Book.objects.all()[::2]# 按步长取,隔一个取一个,,,[::1}挨着取,一个个都取
  9. # print(ret3)#<QuerySet [<Book: Linux>, <Book: 项塔兰>]>
  10.  
  11. print(ret4)#[<Book: Linux>, <Book: 追风筝的人>]

-----

可迭代特性, iterator() ,exists()

主要是QuerySet的缓存机制,如果一次从数据库取出很多数据,就有可能导致程序崩溃,可以利用iterator()方法,做性能优化,

为了判断获取到的对象是否有值,没有必要遍历所有的对象,用exists()方法()

  1. #可迭代特性
  2.  
  3. book_list = Book.objects.all() #取出数据库的所有对象,要考虑cache机制,如果数据量太大,程序就会崩溃
  4.  
  5. #判断book_list 是否有值,假如有很多数据,就没有必要全部查一遍才得知有数据,只要查到有1条数据,就可以知道book_list有数据,就用exists()方法
  6.  
  7.   if book_list.exists():
  8.   print('ok') #ok ,说明数据库有值
  9. #利用itertor()方法 book_list1 = Book.objects.all().iterator() #这次就不能用2次for循环,第一次for循环,就已经把遍历完了,
  10.   
  11.  
  12. book_list1 = Book.objects.all().iterator() #这次就不能用2次for循环,第一次for循环,就已经把遍历完了,用next()方法每次取出一个值,
  13. print(next(book_list1)) #linux
  14. print(next(book_list1))#项塔兰
  15. print(next(book_list1))#追风筝的人
  16.  
  17.  
  18.  
  19.  
  20. Book.objects.filter(id=2).update(price=100.00)#对数据库数据进行更新,但并没有执行,只有在用到的时候在执行
  21.  
  22. for obj in book_list: # 在for循环时开始执行sql语句查询
  23. print(obj.title,obj.price)
  24.  
  25. #如果for循环2次,打印2次结果,也是执行一次sql语句,因为存在sql的缓存机制,把第一次查询的结果放到缓存里,
  26. #下次从缓存里调
  27. """
  28. Linux 30.00 ---没有更新数据之前
  29. 项塔兰 45.00
  30. 追风筝的人 39.90
  31. 富爸爸 23.00
  32. """
  33.  
  34. """
  35. Linux 100.00 ----更新数据之后
  36. 项塔兰 45.00
  37. 追风筝的人 39.90
  38. 富爸爸 23.00
  39. """

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号