当前位置:网站首页>11-Django-基础篇-数据库操作
11-Django-基础篇-数据库操作
2022-07-28 00:38:00 【爱学习de测试小白】
数据库操作
前言
- 本篇来学习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
边栏推荐
- Enterprise operation and maintenance practice - using aliyun container image service to pull and build images of overseas GCR and quay warehouses
- A happy old age
- Unity universal red dot system
- Common modules of ros2 launch files
- Use of recursion: 1. Convert the tiled array to a tree 2. Convert the tree to a tiled array
- 数据输出-图片注释、标注
- ros2 launch文件常用模块
- 萤石网络,难当「孤勇者」
- 【数据库数据恢复】SQL Server数据库磁盘空间不足的数据恢复案例
- BGP federal experiment
猜你喜欢

机器学习如何做到疫情可视化——疫情数据分析与预测实战

二叉树的遍历和性质

C# 使用Abp仓储访问数据库时报错记录集

如何评估研发人员效能?软件工程师报告帮你看见每个人的贡献

开源飞控(PX4、ardupilot)

Unity universal red dot system
![Likeshop takeout ordering system [100% open source, no encryption]](/img/e6/a73aa817b5b30339d755aa53708072.png)
Likeshop takeout ordering system [100% open source, no encryption]

Hcip day 12 notes

Solution of digital commerce cloud supply chain centralized purchase management system: centralized purchase system management mode, digital control of enterprise materials

How to evaluate the effectiveness of R & D personnel? Software Engineer reports help you see everyone's contribution
随机推荐
Solution of digital commerce cloud supply chain centralized purchase management system: centralized purchase system management mode, digital control of enterprise materials
Gbase 8C transaction ID and snapshot (III)
shell正则和元字符
Unreal ue4.27 switchboard porting engine process
小米网站主页面大模块——小模块+导航(浮动案例)
HyperMesh circular array - plug in
Fluorite network, difficult to be a "lone brave"
ros2 launch文件常用模块
学习了循环碰到了编写计算n的阶乘的题目,由此引发了一系列问题,包括一些初学者常见的坑,以及如何简化代码
FreeRTOS kernel summary
【数据库数据恢复】SQL Server数据库磁盘空间不足的数据恢复案例
Gbase 8C snapshot synchronization function
Game 302 of leetcode
DeviceXPlorer OPC Server支持哪些设备?本文已列举出来了
A Tiger's Tale
A letter to the user of qubu drawing bed
[Taichi] draw a regular grid in Tai Chi
什么是方法,什么是方法论:了解自我精进提升的底层逻辑
Software test interview question: please introduce the meaning of various test types in detail?
数据安全与隐私计算峰会-可证明安全:学习