- 前言
- 增加数据
- 1. save
- 2. create
- 删除数据
- 1. 模型类对象delete
- 2. 模型类.objects.filter().delete()
- 修改数据
- 1. save
- 2. update
- 查询数据
- 1. 基础条件查询
- 2. F和Q对象
- 3. 聚合函数和排序函数
- 4. 级联查询
- 5. 查询集QuerySet
- 概念
- 两大特性
- 限制查询集
- 分页
前言
- 本篇来学习Django中对数据库进行增、删、改、查操作,
- 通过创建模型类对象,执行对象的save()方法保存到数据库中
from book.models import BookInfo
book = BookInfo(
name='测试小白漂流记',
pub_date='2016-09-01'
)
book.save()
2. create
- 通过模型类.objects.create()保存
from book.models import PeopleInfo
PeopleInfo.objects.create(
name='小白',
book=book
)
- 在shell命令行中执行如下:
- 查看数据库
book = BookInfo.objects.get(name='测试小白魔都漂流记') book.delete()2. 模型类.objects.filter().delete()
BookInfo.objects.filter(name='测试小白帝都漂流记').delete()
- shell工具中执行
- 查看数据库中是否被删除
- 修改模型类对象的属性,然后执行save()方法
book = BookInfo.objects.get(name='测试小白魔都漂流记') book.commentcount = 66 book.save()2. update
- 使用模型类.objects.filter().update(),会返回受影响的行数
BookInfo.objects.filter(name='测试小白帝都漂流记').update(commentcount=88)
-
shell工具中执行
-
查看数据库
- 基本查询
from bookmanager01.models import BookInfo
# get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常
try:
BookInfo.objects.get(id=1)
except BookInfo.DoesNotExist as e:
print(e)
# all 查询多个结果
BookInfo.objects.all()
# count 查询结果数量
BookInfo.objects.all().count()
BookInfo.objects.count()
- 过滤查询
""" fitter过滤出多个结果 返回列表 exclude排除掉符合条件剩下的结果 get过滤单一结果 模型类名.objects.filter(属性名__运算符=值)获取n个结果n=0,1,2,... 模型类名,objects.exclude(属性名__运算符=值)获取n个结果n=0,1,2,... 模型类名.objects.get(属性名__运算符=值)获取1个结果或者异常 """ # 相等 exact # 查询编号为1的图书 BookInfo.objects.filter(id__exact=1) # 简写 BookInfo.objects.filter(id=1) # 模糊查询 # contains:是否包含 BookInfo.objects.filter(name__contains='传') # startswith、endswith:以指定值开头或结尾 BookInfo.objects.filter(name__endswith='部') # 空查询 # isnull:是否为null BookInfo.objects.filter(name__isnull=True) # 范围查询 # in:是否包含在范围内 BookInfo.objects.filter(id__in=[1, 3, 5]) # 比较查询 """ gt大于 (greater then) gte大于等于 (greater then equal) lt小于 (less then) lte小于等于 (less then equal) """ BookInfo.objects.filter(id__gt=3) # 查询编号大于3的图书 BookInfo.objects.exclude(id__gt=3) # 查询编号不等于3的图书 # 日期查询 # year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算 BookInfo.objects.filter(pub_date__year=1980) # 查询1980年发表的图书 BookInfo.objects.filter(pub_date__gt='1990-1-1') # 查询1990年1月1日后发表的图书2. F和Q对象
- F对象
"""
使用:2个属性的比较
语法形式:以filter 为例模型类名。objects.filter(属性名__运算符=F('第二个属姓名'))
"""
from django.db.models import F, Q
# 查询阅读量大于等于评论量的图书。
BookInfo.objects.filter(readcount__gt=F('commentcount'))
# 查询阅读量大于2倍评论量的图书。
BookInfo.objects.filter(readcount__gt=F('commentcount') * 2)
- Q对象
# 并且查询 # 查询阅读量大于20,并且编号小于3的图书。 BookInfo.objects.filter(readcount__gt=20, id__lt=3) # 或者 BookInfo.objects.filter(readcount__gt=20).filter(id__lt=3) # Q对象 可以使用&、|连接,&表示逻辑与,|表示逻辑或。 """ 或者语法:模型类名.objects.filter(Q(属性名__运算符=值)|Q(属性名__运算符=值|...) 并且语法:模型类名.objects.filter(Q(属性名__运算符=值)&Q(属性名__运算符=值)&...) 非语法:模型类名.objects.filter(~Q(属性名__运算符=值)) """ # 查询阅读量大于20的图书,改写为Q对象如下 BookInfo.objects.filter(Q(readcount__gt=20)) # 查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现 BookInfo.objects.filter(Q(readcount__gt=20) | Q(id__lt=3)) # Q对象前可以使用~操作符,表示非not BookInfo.objects.exclude(id=3) BookInfo.objects.filter(~Q(id=3))3. 聚合函数和排序函数
- 聚合函数
from django.db.models import Sum, Avg, Count, Max, Min
# 聚合函数
# 模型类名.objects.aggregate(Xxx('字段名')
BookInfo.objects.aggregate(Sum('readcount'))
BookInfo.objects.aggregate(Max('readcount'))
BookInfo.objects.aggregate(Min('readcount'))
BookInfo.objects.aggregate(Count('readcount'))
BookInfo.objects.aggregate(Avg('readcount'))
- 排序函数
# 排序
# 默认升序
BookInfo.objects.all().order_by('readcount')
# - 表示降续
BookInfo.objects.all().order_by('-readcount')
4. 级联查询
- 关联查询
# 级联查询 # 查询书籍为1的所有人物信息 book = BookInfo.objects.get(id=1) book.peopleinfo_set.all() # # 一对应的模型类对象.多对应的模型类名小写_set # 查询人物为1的书籍信息 person = PeopleInfo.objects.get(id=1) person.book.name # 多对应的模型类对象.多对应的模型类中的关系类属性名 person.book_id # 多对应的模型类对象.关联类属性_id
- 关联过滤查询
# 关联过滤查询 """ 一本书对应多个人物, 由多模型类(人物)条件,查询一模型类(图书)数据 模型类名.objects.(关联模型类名小写__字段名__运算符=值) """ # 查询图书,要求图书人物为"郭靖" BookInfo.objects.filter(peopleinfo__name__exact='郭靖') BookInfo.objects.filter(peopleinfo__name='郭靖') # 等于可省略 运算符 __exact # 查询图书,要求图书中人物的描述包含"八" BookInfo.objects.filter(peopleinfo__description__contains='八') # 由一模型类条件查询多模型类数据: 一模型类关联属性名__一模型类属性名__条件运算符=值 # 查询书名为“天龙八部”的所有人物 PeopleInfo.objects.filter(book__name='天龙八部') # 查询图书阅读量大于30的所有人物 PeopleInfo.objects.filter(book__readcount__gt=30)5. 查询集QuerySet 概念
- 查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
- 当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
两大特性
- all():返回所有数据。
- filter():返回满足条件的数据。
- exclude():返回满足条件之外的数据。
- order_by():对结果进行排序。
- 惰性执行
books = BookInfo.objects.all()
for book in books:
print(book.name)
- 缓存
# [book.id for book in BookInfo.objects.all()] 每执行一次查询一次数据库 books = BookInfo.objects.all() [book.id for book in books] # 经过存储后,可以重用查询集,第二次使用缓存中的数据限制查询集
BookInfo.objects.all()[0:2]分页
# 分页 # 查询数据 books = BookInfo.objects.all() # 导入分页类 from django.core.paginator import Paginator # 创建分页实例 paginator = Paginator(books, 2) # 获取指定页码的数据 page_books = paginator.page(1) # 获取分页数据 total_page = paginator.num_pages



