Django的ORM基础增删改查
查询
- all()
- 返回模型类对应表格中所有数据,返回查询集
- get()
- 返回表格中满足条件的一条且只能有一条数据
- 如果查到多条数据,则抛异常:MultipleObjectsReturned
- 查询不到数据,则抛异常:DoesNotExist
- filter()
- 参数写查询条件,返回满足条件的数据,返回查询集
- 条件格式:模型类属性名__条件名 = 值
==条件名==
- 判等 exact
list=BookInfo.books.filter(id__exact=1)
可简写为:
list=BookInfo.books.filter(id=1)
- 模糊查询
- 包含:contains
- 结尾和开头:endswith;startswith
list = BookInfo.objects.filter(btitle__contains = "部")
list = BookInfo.objects.filter(btitle__startswith = "天")
- 空查询 isnull
<!--查询标题为空-->
BookInfo.objects.filter(btitle__isnull = Flase)
- 范围查询
BookInfo.objects.filter(id__in=[1,3,5])
- 比较查询
- 大于:gt
- 小于:lt
- 大于等于:gte
BookInfo.objects.filter(id__gt=2)
- 日期查询
BookInfo.objects.filter(bpub_date__year = 1980)
BookInfo.objects.filter(bpub_date__gt = date(1980,12,1)
- include():查询不满足条件的数据,返回
BookInfo.objects.include(id=3)
- F对象:类属性之间比较
- 需要导入:from django.db.models import F
demo:查找阅读量大于评论数2倍0的
BookInfo.objects.filter(bread__gt = F(bcomment)*2)
- 需要导入:from django.db.models import F
- Q对象:多个属性之间比较
- 导入模块:from django.db.models import Q
- 或关系:|
- 与关系:&
- 取反:~
BookInfo.objects.filter(Q(bcomment__gt = 40)|Q(bread__gt = 20))
BookInfo.objects.filter(~Q(id=3))
- order_by:排序 返回查询集
- 默认从小到大
- 加 - :从大到小
BookInfo.objects.all().order_by(id)
BookInfo.objects.filter(id__gt = 2).order_by('-bread')
- 聚合 aggregate 返回字典
- 对查询结果进行聚合操作
- sum count max min avg
- 使用前导入:from django.db.models import Sum
例:查询所有图书的数目。
BookInfo.objects.aggregate(Count('id'))
{'id__count': 5}
例:查询所有图书阅读量的总和。
BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}
- count()函数
- 作用:统计满足条件数据的数目。
例:统计所有图书的数目。
BookInfo.objects.count()
注意返回值类型
例:统计id大于3的所有图书的数目。
BookInfo.objects.filter(id__gt=3).count()
删除
- 对象.delete()
修改
- 获取对象,重新写
- save():保存
查询集
查询集特性
- 惰性查询
- 只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。
- 缓存
- 当使用的是同一个查询集时,第一次的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。
限制查询集
- b[0]就是取出查询集的第一条数据,
- b[0:1].get()也可取出查询集的第一条数据。
- 如果b[0]不存在,会抛出IndexError异常,
- 如果b[0:1].get()不存在,会抛出DoesNotExist异常。多条时抛MultiObjectsReturned
- 对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。
exists():判断一个查询集中是否有数据,有返回True
参考了北半球网站的相关资料