03、django查询:基础查询 到 复杂高级的查询

1、基本查询

--在数据库中一般是 读写比 10:1,所以查询操作数远远大于插入、删除、更新等数据库操作数

1、基础查询 -- 查询一条数据
    from book.models import BookInfo, PeopleInfo
 
    try:
        book = BookInfo.objects.get(id=1)
        print(book.read_count) 
    except BookInfo.DoesNotExist:
        pass

    [注:]这种取数据如果不存在会报异常,这样的话会有问题,所以上面加上了异常处理
        book.models.BookInfo.DoesNotExist: BookInfo matching query does not exist.

2、基础查询 -- 查询一张表中所有结果
    book = BookInfo.objects.all()
    查询结果:
        <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: dhin>, <BookInfo: java>]>

3、基础查询 -- 统计一张表中所有数据
    --两种方式都可以查出数据总数:
        BookInfo.objects.all().count()
        BookInfo.objects.count()

2、django ORM框架中:filter    get    exclude三个函数,相当于数据库中where查询

select * from bookinfo where *    # 数据库查询
===  上面数据库语句 等价于 下面django ORM框架
     filter   : 筛选过滤 返回N个结果 (查询结果的数量 = 0/1/2/3 ... n-2/n-1/n)
        get   : 返回一个结果
    exclude   : 排除掉 符合条件的 所有结果,相当于not 和 filter正好结果互补

语法形式:
    属性名称__比较运算符=值


****************************************************************************************

--比较运算符:exact  # 表示精确等于
    # 查询编号为1的图书
        BookInfo.objects.get(id__exact=1)   # 属性 id + 比较运算符 exact[ 等于 ]
        BookInfo.objects.get(id=1)  # 简写形式
        [结果:] <BookInfo: 射雕英雄传>

        BookInfo.objects.filter(id__exact=1)   # 属性 id + 比较运算符 exact[ 等于 ]
        BookInfo.objects.filter(id=1)  # 简写形式
        [结果:] <QuerySet [<BookInfo: 射雕英雄传>]> 

        BookInfo.objects.filter(id__exact=1)[0]   # 按照列表的格式取数据就好
        [结果:] <BookInfo: 射雕英雄传>

--比较运算符:contains  表示包含某一个独特的字符
    # 查询书名包含'湖'的图书
        BookInfo.objects.filter(name__contains='湖')
        
--比较运算符:endswith  # 以什么结尾
    # 查询书名以'部'结尾的图书
        BookInfo.objects.filter(name__endswith='传')

--比较运算符:isnull  # 判断是否为空
    # 查询书名为空的图书
        BookInfo.objects.filter(name__isnull=True)

--比较运算符:in  # 根据某一些特定值选取数据
    # 查询编号为1或3或5的图书
        BookInfo.objects.filter(id__in=[1, 2, 5])
        
--比较运算符:大于  大于等于  小于  小于等于
    # gt    greater than    大于
    # gte    greater than equal    大于等于
    # lt    less than    小于
    # lte    less than equal    小于等于
    # 查询编号大于3的图书
        BookInfo.objects.filter(id__gt=2)

--比较运算符:剔除某一个值,记住exclude是可以像filter一样随意使用比较运算符的,所以请尽情发挥你的想象力
    # 查询书籍编号不为2的
        BookInfo.objects.exclude(id=2)
        BookInfo.objects.exclude(id__in=[2, 1, 3])
        
--比较运算符:date_time类型的数据格式,可以使用像 year day这样的特殊的比较运算符,其他的相关运算符请自行查看
    # 查询1980年发表的图书
        BookInfo.objects.exclude(pub_date__year='1980')

--比较运算符:时间比较越大,说明越早 即 1990 > 2000
    # 查询1990年1月1日后发表的图书
        BookInfo.objects.exclude(pub_date__lt='1990-1-1')



3、F对象:两个属性之间的比较,区别于Q对象的联合查询

--两个属性之间的比较:
    比如说一个楼房:高度 和 地下深度 两个属性之间比较,都是数字可以比较。在计算机中可以比较是指数据类型是否一致,至于其实际意义不在考虑中,比如说占地面积 和 高度 实际单位不一致但是计算机比较起来没有任何问题

--上面的解释其实就是对数据进行初步多维度筛选的一个缩影,也就是我们这里所用到的F对象

--语法:
    from django.db.models import F

    F(属性名)

--案例:
    from django.db.models import F

    BookInfo.objects.filter(read_count__gt=F('comment_count'))  # 查询阅读数 大于 评论数的书籍

    BookInfo.objects.filter(read_count__gt=F('comment_count')*2)  # 查询阅读数 大于 评论数2倍的

4、Q对象

--select  from   where   ** and **  实现方式,filter级联 和 Q对象都可以

--查询 id 大于 2 且 comment_count 大于 20的书籍
    --方式1:filter().filter().*** 的形式
        BookInfo.objects.filter(id__gt=1).filter(comment_count__gt=20)
    --方式2:filter(条件1, 条件2, ***)
        BookInfo.objects.filter(id__gt=1, comment_count__gt=20)        

--上述情况是在 and 条件下的select查询,如果此时条件换成 or,则不能满足要求。因此使用Q对象势在必得
    --Q对象语法:
        Q对象可以使用&、|连接
            -- &表示逻辑与
            -- |表示逻辑或
            -- ~表示 非
               

    --Q对象使用案例:
        --from django.db.models import Q
        -- BookInfo.objects.filter(Q(read_count__gt=20)&Q(id__lt=4))  # 查询 阅读数大于 20 或者 id 小于 4 的书籍
        -- BookInfo.objects.filter(Q(read_count__gt=20)|Q(id__lt=3))  # 查询 阅读数 大于 20 且 id 小于 3 的书籍

        --BookInfo.objects.filter(~Q(id=3))  # 查询 id不为3 的书籍
        --BookInfo.objects.exclude(id=3)  # 查询 id不为3 的书籍

        

5、聚合查询  --  聚合函数 Sum , Max , Min , Avg , Count

--常见的聚合函数有 5 个。这里作为举例,后续深入或者用到了请自行查询:
    sum  max  min  avg  count

--语法:
    使用aggregate()过滤器调用聚合函数,被定义在django.db.models中

--使用案例:
    导入聚合函数 Sum , Max , Min , Avg , Count
    --from django.db.models import Sum , Max , Min , Avg , Count
    --BookInfo.objects.aggregate(Sum('read_count'))  # 阅读数量汇总统计
    --BookInfo.objects.aggregate(Sum('comment_count'))  # 评论数量汇总统计

6、排序函数

# 默认升序
>>> BookInfo.objects.all().order_by('read_count')
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 笑傲江湖>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>]>


# 降序
>>> BookInfo.objects.all().order_by('-read_count')
<QuerySet [<BookInfo: 雪山飞狐>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 射雕英雄传>]>

7、关联查询

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值