一、增加
1.save()方法:通过创建模型类对象,执⾏对象的save()⽅法保存到数据库中。
from film.models import PeopleInfo
f1=PeopleInfo(fname='zhangsan',age=20)
f1.save()
2.create()方法:模型类.objects.create()
PeopleInfo.objects.create(fname='zhangsan',age=20)
二、修改
1.save()方法:修改模型类对象的属性,然后执⾏save()⽅法
f1=PeopleInfo.objects.get(fname='zhangsan')
f1.fname='lisi'
f1.save()
2.update()方法:使⽤模型类.objects.filter().update(),会返回受影响的⾏数
PeopleInfo.objects.filter(fname='zhangsan').update(fname='lisi')
三、删除
1.模型类对象delete
f1=PeopleInfo.objects.get(fname='zhangsan')
f1.delete()
2.模型类.objects.filter().delete()
PeopleInfo.objects.filter(fname='zhangsan').delete()
四、查询
1. 基本查询
get():查询单⼀结果,如果不存在会抛出模型类.DoesNotExist异常。
all():查询多个结果。
count():查询结果数量。
FilmInfo.objects.get(fid=1001)
FilmInfo.objects.all()
FilmInfo.objects.count()
2. 过滤查询
filter过滤出多个结果
exclude排除掉符合条件剩下的结果
get过滤单⼀结果 对于过滤条件的使⽤,上述三个⽅法相同,故仅以filter进⾏ 讲解。
属性名称__⽐较运算符=值
# 属性名称和⽐较运算符间使⽤两个下划线,所以属性名不能包括多个下划线
1)相等 exact:表示判等。
例:查询编号为1001的影⽚。
FilmInfo.objects.filter(fid__exact=1001)
可简写为: FilmInfo.objects.filter(fid=1001)
2)模糊查询 contains:是否包含
例:查询书名包含'我'的影⽚。
FilmInfo.objects.filter(fname__contains='我')
startswith、endswith:以指定值开头或结尾。
以上运算符都区分⼤⼩写,在这些运算符前加上i表示不区分⼤⼩写,如 iexact、icontains、istartswith、iendswith.
3) 空查询 isnull:是否为null。
例:查询影⽚名为空的影⽚。
FilmInfo.objects.filter(fname__isnull=True)
4) 范围查询 in:是否包含在范围内。
例:查询编号为1001或1003或1005的影⽚
FilmInfo.objects.filter(fid__in=[1001,1003,1005])
5)⽐较查询
gt⼤于 (greater then)
gte⼤于等于 (greater then equal)
lt⼩于 (less then)
lte⼩于等于 (less then equal)
例:查询编号⼤于1001的影⽚
FilmInfo.objects.filter(fid__gt=1001)
不等于的运算符,使⽤exclude()过滤器。
6)⽇期查询
year、month、day、week_day、hour、minute、second:对⽇期时间类型的属性 进⾏运算
例:查询2020年发表的影⽚。
FilmInfo.objects.filter(pub_date__year=2020)
五. F对象
语法:F(属性名)
之前的查询都是对象的属性与常量值⽐较,两个属性怎么⽐较呢? 答:使⽤F对 象,被定义在django.db.models中。
例:查询播放量⼤于等于评论量的影⽚。
from django.db.models import F
FilmInfo.objects.filter(playcount__gt=F('commentcount'))
可以在F对象上使⽤算数运算。 例:查询播放量⼤于2倍评论量的影⽚。
FilmInfo.objects.filter(playcount__gt=F('commentcount')*2)
六、Q对象:
多个过滤器逐个调⽤表示逻辑与关系,同sql语句中where部分的and关键字。
例:查询播放量⼤于20,并且编号⼩于1003的影⽚
FilmInfo.objects.filter(playcount__gt=20,fid__lt=1003)
或者 FilmInfo.objects.filter(playcount__gt=20).filter(fid__lt=1003)
1.如果需要实现逻辑或or的查询,需要使⽤Q()对象结合|运算符,Q对象被定义在 django.db.models中。语法:Q(属性名__运算符=值)
例:查询播放量⼤于20的影⽚,改写为Q对象如下
FilmInfo.objects.filter(Q(playcount__gt=20))
2.Q对象可以使⽤&、|连接,&表示逻辑与,|表示逻辑或。
例:查询播放量⼤于20,或编号⼩于1003的影⽚,只能使⽤Q对象实现
FilmInfo.objects.filter(Q(playcount__gt=20)|Q(fid__lt=1003))
3.Q对象前可以使⽤~操作符,表示⾮not。
例:查询编号不等于1003的影⽚。
FilmInfo.objects.filter(~Q(fid=1003))
七、聚合函数
使⽤aggregate()过滤器调⽤聚合函数。聚合函数包括:Avg平均,Count数量,Max 最⼤,Min最⼩,Sum求和,被定义在django.db.models中。
例如:查询影⽚的总播放量。
FilmInfo.objects.aggregate(Sum('playcount'))
》》{'playcount__sum': 30000}
注意: aggregate 的返回值是⼀个字典类型:格式如下:
{'属性名__聚合类⼩写':值}
使⽤count时⼀般不使⽤aggregate()过滤器。
八、 排序
使⽤ order_by 对结果进⾏排序
# 默认升序
FilmInfo.objects.all().order_by('playcount')
# 降序
FilmInfo.objects.all().order_by('-playcount')
九、关联查询
1、由⼀到多的访问语法:
⼀对应的模型类对象.多对应的模型类名⼩写_set 例:
# 查询影⽚编号为1001的所有⼈物信息
film = FilmInfo.objects.get(fid=1001)
film.peopleinfo_set.all()
2、由多到⼀的访问语法:
多对应的模型类对象.多对应的模型类中的关系类属性名 例:
# 查询⼈物编号为1的影⽚信息
person = PeopleInfo.objects.get(uid=1)
person.film
3、访问⼀对应的模型类关联对象的id语法:
多对应的模型类对象.关联类属性_id
person = PeopleInfo.objects.get(uid=1)
person.film_id
十、关联过滤查询
1、由多模型类条件查询⼀模型类数据:
语法如下: 关联模型类名⼩写__属性名__条件运算符=值
注意:如果没有"__运算符"部分,表示等于。
# 查询影⽚信息,要求影⽚⼈物为"吴京"
Film = FilmInfo.objects.filter(peopleinfo__uname='吴京')
# 查询影⽚信息,要求影⽚中⼈物的描述包含"d"
Film = FilmInfo.objects.filter(peopleinfo__desc__contains='d')
2、由⼀模型类条件查询多模型类数据:
语法如下: ⼀模型类关联属性名__⼀模型类属性名__条件运算符=值
注意:如果没有"__运算符"部分,表示等于。
# 查询影⽚名为“夺冠”的所有⼈物。
people = PeopleInfo.objects.filter(film__fname='夺冠')
# 查询影⽚播放量⼤于30的所有⼈物
people = PeopleInfo.objects.filter(film__playcount__gt=30)
1. 概念
Django的ORM中存在查询集的概念。 查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
判断某⼀个查询集中是否有数据: exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
2. 两⼤特性
1)惰性执⾏ 当执⾏查询操作返回QuerySet时,默认查询前21条数据。
FilmInfo.objects.all()
查看映射SQL:select * from t_filminfo limit 21;
2)缓存 默认情况下,QuerySet会把结果存放在内置当缓存中。 QuerySet提供了 _result_cache 的变量专⻔存储缓存。
films = FilmInfo.objects.all() # 当执⾏完这条语句后,films._result_cache能够查看到结果
3. 限制查询集 可以对查询集进⾏取下标或切⽚操作,等同于sql中的 limit 和 offset ⼦句。
注意:不⽀持负数索引。
对查询集进⾏切⽚后返回⼀个新的查询集,不会⽴即执⾏查询。 如果获取⼀个对象,直接使⽤[0],等同于[0:1].get(),但是如果没有数据,[0]引发 IndexError异常,[0E1].get()如果没有数据引发DoesNotExist异常。
示例:获取第1、2项,运⾏查看。
films = FilmInfo.objects.all()[0:2]
<QuerySet [<FilmInfo:夺冠>,<FilmInfo:金刚川>] >
4、分页
#查询数据
films = FilmInfo.objects.all()
#导⼊分⻚类
from django.core.paginator import Paginator
#创建分⻚实例
paginator=Paginator(films,2)
#获取指定⻚码的数据
page_skus = paginator.page(1)
#获取分⻚数据
total_page=paginator.num_pages
分页链接:https://docs.djangoproject.com/en/2.2/topics/pagination/