Django QuerySet 使用技巧总结

QuerySet是Django的查询集,可以通过QuerySet条件查询得到对应模型的对象集合。

queryset 相当于sql 中的select语句

基本查询方法:all, filter, get, exclude.

  • all() : 获取某张表的所有记录;
  • filter(**kwargs) :  返回一个根据参数查询到的queryset;
  • exclude(**kwargs): 和filter正好相反,返回除了根据参数查到的结果的其他值;

以上三种查询方法获得的结果,类型是一个结果集,相当于Python中列表,所以支持切片(不支持负数)、排序、获取长度等方法,

如all()[1:10],all().order_by(**kwargs),filter().len(),exclude().count()

  • get(**kwargs): 返回一个根据参数查询到的唯一值,不再是列表类型。查询值不存在的话会报错DoesNotExist;

支持链式查询,如filter().filter().exclude().get(),

还可后接distinct(),表示去重;也可以接delete(),表示删除;update(),表示更新;explain(),表示执行该条语句所用时间

以上查询方法中的条件参数,可以用修饰符拓展,修饰符是两个下划线加修饰词

Django的数据库API支持20多种查询类型,下面介绍一些常用的:

  1. excat:  默认类型,相当于不写
  2. iexact:  不区分大小写
  3. contains/icontains:  表示包含,后者不区分大小写
  4. startwith/istartwith:   自己猜
  5. endwith/iendwith:  再猜
  6. gt/gte:  大于/不小于
  7. lt/lte:  小于/不大于
  8. in:  后面跟一个列表,表示是否是列表中的一个元素
  9. year/month/date:   时间查询
  10. range:  范围查询
  11. F表达式,比较两个一个模型的两个字段。如filter(comment1__gt=F(comment2)),表示找出comment1大于comment2的对象。
  12. Q函数,表示逻辑或or。如Artical.objects.filter(Q(comment1__icontains='django')|Q(comment2__icontains='python')),相当于Artical.objects.filter(comment1__icontains='django')|Artical.objects.filter(comment1__icontains='python')

 

QuerySet有两个特性:惰性和自带缓存

惰性:单纯的定义queryset不会执行数据库操作,只有对它做进一步运算,例如打印、查询数量、是否存在等操作时才会执行。

自带缓存:当第一遍查询完结果后,会自动将结果缓存到queryset自带的cache中,第二次重新用此queryset将会直接使用此缓存结果,而不会再去操作数据库,减少与数据库的交互。

 

你可能感兴趣的:(python,django)