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.缓存,就是当查询一次之后它会保留结果,而不是马上销毁,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数