【Django】MySQL数据库的增删改查(ORM)

1.shell

在Django项目,我们在对数据库的CRUD一般都是在视图函数里完成的,但是由于开发过程中可能会有很多测试,每次都写和运行的确不方便,所以我们可以借助Django提供的shell操作

python manage.py shell

打开shell之后,它会自动根据我们之前的配置连接数据库,接下来我们可以把之前写好的模型类导入

form 子应用名.models import 模型类名
from books.models import BookInfo,HeroInfo

2.增加数据

增加数据有两种方法

2.1 save()

创建一个对象,设置好属性之后,调用save()方法进行提交

book = BookInfo()
book.btitle = '三国演义'
book.bpub_date = '1998-05-06'
book.bread = 20
book.bcomment = 50
book.save()
2.2 create()

模型类.objects.create()


BookInfo.objects.create(
	btitle='红楼梦',
	bpub_date='2020-08-28',
	bread=100,
	bcomment=50
)

3.删除数据

删除也有两种方法

方法一:
book= BookInfo.objects.get(id=5)
book.delete()

方法二:
BookInfo.objects.filter(id=5).delete()

4.修改数据

修改数据也有两种方法

方法一:
book = BookInfo.objects.get(btitle="天龙八部")
book.btitle= "天龙八部2"
book.save()

方法二:
BookInfo.objects.filter(btitle="天龙八部").update(btitle="天龙八部2")

5.查询数据

5.1 基本查询
1.get(),查询单一结果
book = BookInfo.objects.get(id=5)
book.btitle
# 注意,当get不到符合条件的结果时会报异常的

2.all(),查询全部结果
BookInfo.objects.all()  # 返回QuerySet,包含全部结果,若无数据则返回一个空的QuerySet

3.count(),查询数量
BookInfo.objects.count()  # 返回总结果数

5.2 过滤查询

过滤查询,类似于SQL的where关键字,filter过滤出满足条件的全部结果,而exclude是排除满足条件的全部结果

用法:用两个下划线链接属性名和比较运算符
属性名__比较运算符 =

常用运算符如下

运算符 说明
exact 相等,例如:
BookInfo.objects.filter(id__exact=1)
exclude 不等于,例如:
BookInfo.objects.exclude(id=3)
gt 、gte、lt、lte gt(greater then),大于
gte(greater then equal),大于等于
lt(less then),小于
lte(less then equal),小于等于
contains 包含某个字符,例如:
BookInfo.objects.filter(btitle__contains=‘传’)
startswith 以某字符开头,例如:
BookInfo.objects.filter(btitle__startswith=‘天’)
endswith 以某字符结尾,例如:
BookInfo.objects.filter(btitle__endswith=‘部’)
isnull 是否为空,True为空,False为非空,例如:
BookInfo.objects.filter(btitle__isnull=False)
in 在某个范围内,例如:
BookInfo.objects.filter(id__in=[1, 3, 5])
year 年,类似的还有month、day、week_day、hour、minute、second,例如:
BookInfo.objects.filter(bpub_date__year=1980)
5.3 F对象

使用F对象可以比较属性

from django.db.models import F
BookInfo.objects.filter(bread__gte=F('bcomment'))
BookInfo.objects.filter(bread__gt=F('bcomment')*2)
5.4 Q对象

使用Q对象可以在逻辑关系中使用,可以配合与(&)、或(|)、非(~)运算符使用

from django.db.models import Q

1.查询阅读量大于20或者id小于3的图书
BookInfo.objects.filter(Q(bread__gt=20) | Q(id__lt=3))

2.查询id不等于3的图书
Book.objects.filter(~Q(id=3))
5.5 聚合函数

使用聚合函数需要配合aggregate()过滤器

from django.db.models import Sum,Count,Avg,Max,Min

1.统计个数
BookInfo.objects.aggregate(Count('btitle'))

2.统计平均阅读量和总阅读量
BookInfo.objects.aggregate(Avg('bread'),Sum('bread'))

3.统计阅读量的最大值和最小值
BookInfo.objects.aggregate(Max('bread'),Min('bread'))

5.6 排序

我们可以使用order_by对结果进行排序

BookInfo.objects.all().order_by('bread')  # 升序
BookInfo.objects.all().order_by('-bread')  # 降序
5.7 关联查询

一对多: 一本书对应多个人物

b = BookInfo.objects.get(id=1)  # 获取一个书本对象
b.heroinfo_set.all()  # 多对应的模型类名小写_set

多对一: 多个人物出现在同一本书里

h = HeroInfo.objects.get(id=1)  # 获取某个人物
h.hbook  # 对应的关系类属性名

h = HeroInfo.objects.get(id=1)  # 获取某个人物
h.hbook_id  # 关联类属性_id

6.查询结果集(QuerySet)

当查询返回的结果有多条记录时,就得到一个QuerySet,我们可以使用exists()判断是否有数据,若有则返回True,若没有则返回False。

QuerySet有两大特性,惰性执行和缓存
1.惰性执行是指当语句输入之后并不会马上执行,而是直到调用数据的时候才会真的连接数据库进行操作。
2.缓存,就是当查询一次之后它会保留结果,而不是马上销毁,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数

猜你喜欢

转载自blog.csdn.net/qq_39147299/article/details/108283013