Django(五):数据库操作(增删改查)
文章目录
一、增加
- save()
from datetime import date
book = BookInfo()
book.btitle = '流浪地球'
book.bpub_date = date(2001,7,1)
book.save()
- create()
HeroInfo.objects.create(
hname='txf',
hgender=1,
hbook_id=book.id
)
二、查询
基本查询
- get():查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
- all 查询多个结果。
- count 查询结果数量
BookInfo.objects.all()
HeroInfo.objects.count()
HeroInfo.objects.get(id=1)
HeroInfo.objects.get(pk=1)
BookInfo.objects.get(id=188)
过滤查询
实现SQL中的where功能,包括
- filter 过滤出多个结果
- exclude 排除掉符合条件剩下的结果
- get 过滤单一结果
过滤条件的表达语法如下:
属性名称__比较运算符=值
1、相等
exact:表示相等
BookInfo.objects.filter(id__exact=1)
# 可简写为:
BookInfo.objects.filter(id=1)
2、模糊查询
contains:包含
startswith:以什么开头
endswith:以什么结尾
HeroInfo.objects.filter(hcomment__contains='掌')
HeroInfo.objects.filter(hname__contains='黄')
3、空查询,范围查询
isnull:空查询
in:范围查询
BookInfo.objects.filter(id__in=[1,3,5])
BookInfo.objects.filter(btitle__isnull=False)
4、比较查询
- gt 大于 (greater then)
- gte 大于等于 (greater then equal)
- lt 小于 (less then)
- lte 小于等于 (less then equal)
- 不等于可以使用不满足条件 exclude() 过滤器
BookInfo.objects.filter(id__gt=2)
# 查询id 不为 1,3,5 的图书信息
BookInfo.objects.exclude(id__in=[1,3,5])
5、日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算
# 查询1980年发表的图书。
BookInfo.objects.filter(bpub_date__year=1980)
#查询1980年1月1日后发表的图书。
BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
6、F对象
之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。
from django.db.models import F
# 查询阅读量大于等于评论量的图书。
BookInfo.objects.filter(bread__gte=F('bcomment'))
# 可以在F对象上使用算数运算。查询阅读量大于2倍评论量的图书。
BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
7、Q对象
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
- &:与,相当pyhton中的and,flask查询中的and_
- |:或,相当pyhton中的or,flask查询中的or_
- ~:非,相当pyhton中的not,flask查询中的not_
# 查询阅读量大于20,并且编号小于3的图书。
BookInfo.objects.filter(bread__gt=20,id__lt=3)
# 也可以使用连续查询,因为BookInfo.objects.filter(bread__gt=20)的结果是QuerySet 对象,
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
# 改成Q查询
BookInfo.objects.filter(Q(bread__gt=20)&Q(id__lt=3))
# 查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
# 查询编号不等于3的图书。
BookInfo.objects.filter(~Q(pk=3))
8、聚合函数
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。
from django.db.models import Sum
# 查询图书的总阅读量。
BookInfo.objects.aggregate(Sum('bread'))
注意:
aggregate的返回值是一个字典类型,格式如下:
{‘属性名__聚合类小写’:值}
9、排序
order_by
# 使用order_by对结果进行排序
BookInfo.objects.all().order_by('bread') # 升序
# 降序给排序字段名前加负号 ‘-’
BookInfo.objects.all().order_by('-bread') # 降序
10、关联查询
1)、直接查询
- 一到多:一对应的模型类对象.多对应的模型类名小写_set
book = BookInfo.objects.get(id=3)
print(book)
# 一对应的模型类对象.多对应的模型类名小写_set
heros = book.heroinfo_set.all()
print(heros)
- 多到一:多对应的模型类对象.多对应的模型类中的关系类属性名
hero = HeroInfo.objects.get(id=1)
print(hero)
# 多对应的模型类对象.多对应的模型类中的关系类属性名
book = hero.hbook
print(book)
- 访问一对应的模型类关联对象的id语法:多对应的模型类对象.关联类属性_id
h = HeroInfo.objects.get(id=1)
h.hbook_id
2)、过滤查询
- 由多模型类条件查询一模型类数据
一类名.objects.filter(多类名小写__多类属性名__条件名)
# 查询英雄名包含‘不’的图书
BookInfo.objects.filter(heroinfo__hname__contains='不')
# <QuerySet [<BookInfo: 笑傲江湖>, <BookInfo: 笑傲江湖>]>
- 由一模型类条件查询多模型类数据
多类名.objects.filter(关联属性__一类属性名__条件名)
# 查询书名为‘雪山飞狐’的所有英雄
HeroInfo.objects.filter(hbook__btitle='雪山飞狐')
#<QuerySet [<HeroInfo: 胡斐>, <HeroInfo: 苗若兰>, <HeroInfo: 程灵素>, <HeroInfo: 袁紫衣>]>
注意:
①通过模型类实现关联查询时,要查询哪个表中的的数据时,就需要通过哪个表查询
②写关联查询条件时,若果类中没有关系属性,条件需要写对应类的名,如果类中有关系性属性,直接使用关系属性
三、修改
修改更新有两种方法
1、save
修改模型类对象的属性,然后执行save()方法
hero = HeroInfo.objects.get(hname='txf')
hero.hname = '田小芳'
hero.save()
2、update
使用模型类.objects.filter().update(),会返回受影响的行数
HeroInfo.objects.filter(hname='jjj').update(hname='django')
四、删除
删除有两种方法
1、模型类对象delete
hero = HeroInfo.objects.get(id=13)
hero.delete()
2、模型类.objects.filter().delete()
HeroInfo.objects.filter(id=14).delete()
五、查询集QuerySet
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
1、返回值为查询集的方法
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
- all():返回所有数据。
- filter():返回满足条件的数据。
- exclude():返回满足条件之外的数据。
- order_by():对结果进行排序。
说明:
对一个返回值为查询集的实例,可以继续使用我们前面学的查询函数
2、特性
- 惰性查询(懒加载):
创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用 - 缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数
3、限制查询集
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句,不支持负数索引。
获取第1、2项,运行查看。
qs = BookInfo.objects.all()[0:2]