一、 F对象
之前的查询都是对象的属性与常量值⽐较,两个属性怎么⽐较呢? 答:使⽤F对象,被定义在django.db.models中。
语法如下:
F(属性名)
1、例:查询播放量⼤于等于评论量的影⽚。
from django.db.models import F
FilmInfo.objects.filter(playcount__gt=F('commentcount'))
<QuerySet [<FilmInfo: 金刚狼>, <FilmInfo: 夺冠>, <FilmInfo: 我和我的家人>, <FilmInfo: shell>]>
可以在F对象上使⽤算数运算。
2、例:查询播放量⼤于2倍评论量的影⽚。
FilmInfo.objects.filter(playcount__gt=F('commentcount')*2)
<QuerySet [<FilmInfo: 金刚狼>, <FilmInfo: 夺冠>, <FilmInfo: 我和我的家人>, <FilmInfo: shell>]>
二、Q对象
多个过滤器逐个调⽤表示逻辑与关系,同sql语句中where部分的and关键字。
3、例:查询播放量⼤于20,并且编号⼩于1003的影⽚。
方法1
FilmInfo.objects.filter(playcount__gt=20,fid__lt=4)
<QuerySet [<FilmInfo: 金刚狼>, <FilmInfo: 夺冠>]>
方法2
FilmInfo.objects.filter(playcount__gt=20).filter(fid__lt=4)
<QuerySet [<FilmInfo: 金刚狼>, <FilmInfo: 夺冠>]>
如果需要实现逻辑或or的查询,需要使⽤Q()对象结合|运算符,Q对象被定义在django.db.models中
语法如下:
Q(属性名__运算符=值)
4、例:查询播放量⼤于20,或编号⼩于3的影⽚,只能使⽤Q对象实现
Q对象可以使⽤&、|连接,&表示逻辑与,|表示逻辑或。
FilmInfo.objects.filter(Q(playcount__gt=20) | Q(fid__lt=3))
<QuerySet [<FilmInfo: django>, <FilmInfo: 金刚狼>, <FilmInfo: 夺冠>, <FilmInfo: 我和我的家人>, <FilmInfo: shell>]>
Q对象前可以使⽤~操作符,表示⾮not。
5、例:查询编号不等于3的影⽚
FilmInfo.objects.filter(~Q(fid=3))
<QuerySet [<FilmInfo: django>, <FilmInfo: 我爱你中国>, <FilmInfo: 我爱你china>]>