F和Q对象
F对象
- 上次的只能是
python属性对应的数据库的字段
与一个固定值
的比较,即使是date这种复杂类型,也是已知的,不能实现数据库中两个属性的比较,如某书文章的点赞数
和观看数
的比较。
其实也是可以的就像是
bcomment__lte=F('bread')
,可以返回评论数小于阅读量的结果集,其中F
这个函数是需要引入的,参数是字符串型,参数内容是数据库中的字段名(所对应的python的属性名,但是我们问了避免错误,默认是一样的。)
代码如下
from django.db.models import F
text = ''
books = BookInfo.objects.filter(bcomment__lte=F('bread'))
for book in books:
text += str(book.bdate) + book.btitle+ str(book.bcomment)
text +='<br>'
return HttpResponse(text)
- 这里面的F('bread')*2 也是可以的,数据库的类型是int型,就可以进行运算。
Q对象
1.1对象多个条件的查询, 可以在filter中出现多个参数。
books = BookInfo.objects.filter(bcomment__lte=F('bread') , id = 3 )
#判等简写
1.2也可以通过多次filter来实现多重过滤。
books = BookInfo.objects.filter(bcomment__lte=F('bread')).filter( id__exact= 3 )
#判等可以简写
3.都不如用Q对象
Q( 属性名__运算符= 值(可能又是F对象) )
,Q对象可以用&
|
~
连接,表示 与 或 非。
代码如下:F ,Q对象同时用了。
from django.db.models import F, Q
def index(request):
text = ''
books = BookInfo.objects.filter(Q(bcomment__lte=F('bread'))&Q(id__gt=3))
#两个Q()对象用&连接,同时满足,第一个Q对象里面又表示自身评论数小于阅读量。
for book in books:
text += str(book.bdate) + book.btitle+ str(book.bcomment)
text +='<br>'
return HttpResponse(text)
聚合函数(和filter是同等级别的)
使用aggregate()
函数来调用聚合函数,可用的有Sum
,Avg
,Max
,Min
,Count
函数。
使用时用模型类.objects.aggregate(函数名(' 字段名 ')),aggregate()函数返回的是一个字典类型,取出他的value就要用到key值,而key值被定义为属性名小写__(下划线下划线)聚合函数的小写
- 举个例子Sum,Avg,Max,Min用法一样。
from django.db.models import Sum,F,Q #F和Q也可以在这里引入
def index(request):
s = BookInfo.objects.aggregate(Sum('bcomment')) #返回的时字典
return HttpResponse(s['bcomment__sum']) #通过字典的key取值
- count() 这个比较特殊,不需要aggregate作过滤。直接用。
s = BookInfo.objects.count() #返回的是图书的总数,
#跟最后一本书的id没关系,因为你删除书的时候,id没有变化。但是少了一个id。
查询数据库一般要使用
转存
或者说缓存
来缓解数据库的压力即:将结果集保存在变量中,然后在这个变量中进行各种操作。
限制查询集(实现了limit)
-
其实就是对结果集的切片,只要是结果集就可以切片,还可以进行.get()或者.orderby()或者.filter()再次操作。
[ 起始值 : 结束值 : 步长 ]
网友评论