11-Django-基础篇-数据库操作
Posted 爱学习de测试小白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11-Django-基础篇-数据库操作相关的知识,希望对你有一定的参考价值。
数据库操作
前言
- 本篇来学习Django中对数据库进行增、删、改、查操作,
增加数据
1. save
- 通过创建模型类对象,执行对象的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命令行中执行如下:
- 查看数据库
删除数据
1. 模型类对象delete
book = BookInfo.objects.get(name='测试小白魔都漂流记')
book.delete()
2. 模型类.objects.filter().delete()
BookInfo.objects.filter(name='测试小白帝都漂流记').delete()
- shell工具中执行
- 查看数据库中是否被删除
修改数据
1. save
- 修改模型类对象的属性,然后执行save()方法
book = BookInfo.objects.get(name='测试小白魔都漂流记')
book.commentcount = 66
book.save()
2. update
- 使用模型类.objects.filter().update(),会返回受影响的行数
BookInfo.objects.filter(name='测试小白帝都漂流记').update(commentcount=88)
-
shell工具中执行
-
查看数据库
查询数据
1. 基础条件查询
- 基本查询
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
以上是关于11-Django-基础篇-数据库操作的主要内容,如果未能解决你的问题,请参考以下文章