Django-模型(model)类的查询集和过滤器

在控制器上调用方法返回查询集(QuerySet)。
查询经过过滤器筛选后返回新的查询集,所以可以写成链式调用

链式查询

QuerySet 支持链式查询

Author.objects.filter(name__contains="WeizhongTu").filter(email="tuweizhong@163.com")
Author.objects.filter(name__contains="Wei").exclude(email="tuweizhong@163.com")
 
# 找出名称含有abc, 但是排除年龄是23岁的
Person.objects.filter(name__contains="abc").exclude(age=23)

查询方法汇总

方法说明
all()返回所有数据
filter()返回符合条件的数据
exclude()过滤掉符合条件的数据
order_by()排序
values()一条数据就是一个字典,返回一个列表
get()返回一个满足条件的对象
如果没有找到符合条件的对象,会引发模型类.DoesNotExist异常
如果找到多个,会引发模型类.MultiObjectsReturned异常
first()返回查询集的第一个对象。隐藏BUG:可能会出现first、last获取到的是相同的对象。
last()返回查询集的最后一个对象。隐藏BUG:可能会出现first、last获取到的是相同的对象。
count()返回当前查询集的个数
exist()判断查询集中是否有数据,有数据返回True,否则返回False

隐藏BUG的解决办法:

  • 显式,手动写排序规则

查询集的切片操作

限制查询集,可以使用切片操作。等同于SQL中的limitoffset

切片区间:左闭右开Django切片的索引不能是负数,否则会报错。

Person.objects.all()[:10] 切片操作,前10条
Person.objects.all()[-10:] 会报错!!!
 
# 1. 使用 reverse() 解决
Person.objects.all().reverse()[:2] # 最后两条
Person.objects.all().reverse()[0] # 最后一条
 
# 2. 使用 order_by,在栏目名(column name)前加一个负号
Author.objects.order_by('-id')[:20] # id最大的20条

来自https://code.ziqiangxuetang.com/django/django-queryset-api.html

SQL查询语句中的 limit 与 offset 的区别:

limit y 分句表示: 读取 y 条数据

limit x, y 分句表示: 跳过 x 条数据,读取 y 条数据

limit y offset x 分句表示: 跳过 x 条数据,读取 y 条数据

查询集的缓存

查询集的缓存:每一个查询集都包含一个缓存,来最小化对数据库的访问

在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存,并返回查询结构,以后的查询直接使用查询集的缓存。

我们在写filter()、exclude()、all()都不会真正去查数据库,只有我们在迭代结果集,或者获取单个对象属性时,它才会查询数据库。

这种查询方式也叫懒查询,为了优化结构和查询。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Django中,可以使用以下过滤器操作数据库: 1. 等于过滤器(exact):匹配字段完全符合查询条件的记录。 2. 包含过滤器(contains):匹配字段包含查询条件的记录。 3. 大于过滤器(gt):匹配字段大于查询条件的记录。 4. 小于过滤器(lt):匹配字段小于查询条件的记录。 5. 大于等于过滤器(gte):匹配字段大于等于查询条件的记录。 6. 小于等于过滤器(lte):匹配字段小于等于查询条件的记录。 7. 范围过滤器(range):匹配字段在指定范围内的记录。 8. 正则表达式过滤器(regex):匹配字段满足正则表达式的记录。 9. 模糊查询过滤器(icontains):不区分大小写的匹配字段模糊查询。 10. 排除过滤器(exclude):排除指定条件的记录。 以上就是常见的数据库过滤器,可以根据实际情况选择相应操作。 ### 回答2: 在Django应用中,操作数据库的过滤器主要有如下几种: 1. 精确查询过滤器:可以通过指定具体的值来精确查询符合条件的数据。例如,`Model.objects.filter(name='张三')`可以查询出名字为“张三”的所有数据。 2. 模糊查询过滤器:可以使用模糊匹配方式查询符合条件的数据。例如,`Model.objects.filter(name__contains='张')`可以查询出名字中包含“张”的所有数据。 3. 范围查询过滤器:可以查询在指定范围内的数据。例如,`Model.objects.filter(age__range=(20,30))`可以查询出年龄在20到30之间的所有数据。 4. 排序查询过滤器:可以根据指定字段的值进行升序或降序排序。例如,`Model.objects.order_by('age')`可以按照年龄升序排序查询数据。 5. 条件查询过滤器:可以根据多个条件进行复杂的查询。例如,`Model.objects.filter(Q(name='张三') | Q(age=25))`可以查询出名字为“张三”或者年龄为25岁的数据。 6. 过滤器的链式调用:可以通过多次使用过滤器进行链式调用,逐步缩小结果。例如,`Model.objects.filter(name__contains='张').filter(age=25)`可以先通过名字模糊查询,再按照年龄精确查询数据。 以上是在Django应用中操作数据库的一些常用过滤器,通过合理的使用它们,可以高效地进行数据库查询和数据筛选。 ### 回答3: 在Django应用中,我们可以使用多种过滤器来操作数据库。以下是常用的过滤器: 1. 基于字段的过滤器:这些过滤器允许我们根据特定字段的值来过滤数据库查询结果。一些常见的基于字段的过滤器包括: - exact: 精确匹配某个字段的值。 - iexact: 不区分大小写地精确匹配某个字段的值。 - contains: 检查某个字段是否包含指定的值。 - icontains: 不区分大小写地检查某个字段是否包含指定的值。 - startswith: 检查某个字段的值是否以指定的值开头。 - istartswith: 不区分大小写地检查某个字段的值是否以指定的值开头。 - endswith: 检查某个字段的值是否以指定的值结尾。 - iendswith: 不区分大小写地检查某个字段的值是否以指定的值结尾。 - in: 检查某个字段的值是否在指定的列表中。 - gt: 检查某个字段的值是否大于指定的值。 - lt: 检查某个字段的值是否小于指定的值。 2. 关联字段的过滤器:这些过滤器允许我们在查询时使用关联模型的字段来过滤数据库结果。常见的关联字段过滤器包括: - related_model__field: 使用关联模型的字段进行过滤。 - related_model__field__exact: 精确匹配关联模型的字段的值。 3. 聚合过滤器:这些过滤器允许我们对查询结果进行聚合操作,如计数、求和、平均值等。一些常见的聚合过滤器包括: - count: 对查询结果进行计数。 - sum: 对查询结果进行求和。 - avg: 对查询结果进行求平均值。 - min: 对查询结果取最小值。 - max: 对查询结果取最大值。 以上是在Django应用中使用的一些常见的数据库过滤器。这些过滤器可以帮助我们更加灵活地查询和操作数据库中的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值