美文网首页
Django中mysql简单查询——二

Django中mysql简单查询——二

作者: 上帝大人 | 来源:发表于2019-04-18 16:24 被阅读0次

    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()再次操作。[ 起始值 : 结束值 : 步长 ]

    相关文章

      网友评论

          本文标题:Django中mysql简单查询——二

          本文链接:https://www.haomeiwen.com/subject/goqtgqtx.html