当前位置:网站首页>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
边栏推荐
- JS what situations can't use json Parse, json.stringify deep copy and a better deep copy method
- Software testing interview question: what do you think is the key to good test case design?
- HyperMesh circular array - plug in
- 【数据库数据恢复】SQL Server数据库磁盘空间不足的数据恢复案例
- Gbase 8C transaction ID and snapshot
- 什么是方法,什么是方法论:了解自我精进提升的底层逻辑
- Zkrollup learning materials summary
- Gbase 8C snapshot synchronization function
- Vxe table/grid cell grouping and merging
- C# 使用Abp仓储访问数据库时报错记录集
猜你喜欢

学习了循环碰到了编写计算n的阶乘的题目,由此引发了一系列问题,包括一些初学者常见的坑,以及如何简化代码

什么是方法,什么是方法论:了解自我精进提升的底层逻辑

Packet capturing wizard netcapture app packet capturing tutorial "complete"

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

Talk to ye Yanxiu, an atlassian certification expert: where should Chinese users go when atlassian products enter the post server era?

结构伪类选择器—查找单个—查找多个—nth-of-type和伪元素

Leveraging the blue ocean of household appliances consumption with "digital channels", the dealer online system enables enterprises to further their business

Leetcode high frequency question 128. the longest continuous sequence, which is often tested in interviews with Internet companies

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

Forget the root password
随机推荐
Real time data warehouse: meituan's real-time data warehouse construction practice
Traversal and properties of binary trees
Packet capturing wizard netcapture app packet capturing tutorial "complete"
MPLS tunnel experiment
软件测试面试题:常见的 POST 提交数据方式
C# 使用Abp仓储访问数据库时报错记录集
Gbase 8C backup control function (III)
Redis设计规范
忘记root密码
数据安全与隐私计算峰会-可证明安全:学习
Game 302 of leetcode
Five basic data structures of redis
[Taichi] draw a regular grid in Tai Chi
Embedded classic communication protocol
They are all talking about Devops. Do you really understand it?
二叉树的遍历和性质
Gbase 8C transaction ID and snapshot (V)
Flex布局学习完成PC端
Comparison between hardware SPI and software analog SPI rate
WMS you don't know