Python学习第129天(ORM单表查询、模糊查询)

说到这个单表的ORM的查询,着实没有很多内容,但是存在一些需要注意的细节,这部分我再测试的时候写的很详细了,我就直接饮用def select方法了

def select(req):

    book_list = Book.objects.filter(id=1)
    # 这里需要注意,虽然我们用filter方法查询id值,得到的结果只有一个,但是他还是一个queryset的集合
    # 可以被迭代,可以进入for循环

    # 但是如果我们这个时候使用的是get方法
    book_list = Book.objects.get(id=1)
    # 此时得到的book_list一定是一个Book的实例对象,所以一定要注意这两个之间的区别问题
    # 但是使用get方法取出多个值的时候,那么这个方法就会报错,就不能取出多个值

    # filter查询后得到的结果情况
    book_list = Book.objects.all()[:3]
    # 获得的是个集合,支持使用切片,对应的mysql语句为limit进行限制内容。
    # [首位:末尾:步长]三个都是可以使用的
    # book = Book.objects.first()   获取第一个对象的方法,但是此时就不能够进行for循环操作
    # 不是集合了,就是一个单个的
    # book = Book.objects.last()    和上面的正好相反,获得最后一个

    # 如果只需要获得表格莫一行的某一部分信息,比如我们需要查看作者000的书籍
    ret = Book.objects.filter(author='000').values('name')
    # 通过获得的queryset集合调用values方法
    # 可以看到此时得到的ret是queryset集合,但是显示出来的情况变了,仅显示内部的元素有点像字典
    # <QuerySet [{'name': '悲惨世界'}, {'name': '藏地密码'}]>作者为"000"的书籍
    # 其实换个思维来说,既然内容是一个字典的形式,那么可以知道values就是可以取多个你想拿的属性
    # ret = Book.objects.filter(author='000').values('name','price')
    # 此时显示的结果就是<QuerySet [{'price': 120, 'name': '悲惨世界'},
    # {'price': 280, 'name': '藏地密码'}]>

    # 说完了这个字典的形式,再说一下如果是不想以字典形式,则可以使用values_list
    ret = Book.objects.filter(author='000').values_list('name','price')
    # 此时显示的结果就是<QuerySet [('悲惨世界', 120), ('藏地密码', 280)]>
    # 两种方法,根据自己的实际需要进行使用

    print(ret)
    # 此时得到的依旧是一个queryset集合

    print(book_list)
    # 所查询出来的是一个Queryset对象
    # <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>,
    # <Book: Book object (3)>, <Book: Book object (4)>]>
    # 可以看出总共是查找出了4个对象,正好就是我们表当中增加过后的四个数据
    print(book_list[0])
    # 而针对Queryset集合内的首个对象,显示为Book object对象,符合我们的正常理解
    # 增加了def __str__方法之后,打印出来显示“python基础”
    # 前面的book_list也随之变成了<QuerySet [<Book: python基础>, <Book: 红楼梦linux>,
    # <Book: 悲惨世界>, <Book: 基督山伯爵>]>

    return render(req,'index.html',{'book_list':book_list})

然后再说一下并没有进行测试的方法;

1.exclude(),他的存在和filter正好是相反的,筛选出括号内不存在的条件

  使用上面我们使用过的Book类,写法如下:

  Book.objects.exclude( name = '000',。。。。)同样是可以使用多个条件的

2.distinct()查重,这个需要进行比较详细的说一下,先看一下实例的样表

  

   这里就存在一个问题,如果我们使用如下语句:

    Book.objects.all().distinct()

    那么跳舞5、6之间会进行去重吗?答案是显然的,id作为非空且唯一的存在,直接进行对比,他们显然不是重复的,不在distinct的去重范围内

  但是对于现实生活中来说,他们明显又是完全一样的,那么就要求,我们在使用distinct的时候多和values一块进行使用

    比如:Book.objects.all().values_list(“name”,“author”).distinct()

    那么此时我们查重的时候,就会将5、6只保留一个,当然values也是可以的,这个时候我们就是明确了查询的那些条目重复,这样和实际的情况比较相似

    以上是distinct

3.count()计数,这个用在超市的收银中比较多,以上面的表格为例,我们可以对每个商品进行编码,相同商品编码相同,通过count就可以知道商品的具体数量是多少。

  以上面图片中的表格为例,我们可以查看每个作者有几本书。

    1、具体操作我们可以首先对作者去重:ret = Book.objects.all().values(‘author’).distinct()

    2、for book_author in ret:

        a = Book.objects.fiter(author = book_author).count()

        print(“%s  一共写了  %s  本书”%(book_author  ,  a))

    3、上面就能实现这么一个效果,同样我们在超市购物结算可能也是这么做的

4.order_by()  对查询结果依照某一字段进行排序,没啥多说的

5.exists()       反馈查询结果,如果QuerySet包含数据,就返回True,否则返回False。

二、模糊查询,之前在mysql中select可以通过用like进行模糊查询,那么ORM使用的是什么呢?

  万能的双下划线  “ _ _ ”

  还是以刚才的表格为例:

  

  如查询书价格大于100小于200的书籍的名字:

    Book.objects.filter(price_ _lt=200  ,  id_ _gt=100).values(“name”)

    总结一下,就是你要找的字段后面跟上_ _之后在跟上一些内容

    _ _gt: 大于  _ _gte: 大于等于

     _ _lt: 小于    _ _lte: 小于等于

    __contains: 包含某一字段(区分大小写)  __icontains: 包含某一字段(不区分大小写)

    startswith,istartswith, endswith, iendswith,

    字面意思很明显的就不多说了,这个还是正则的余孽啊,抽空复习一下正则

昨天加上今天,单表的增删改查就搞定了,明天开始多表的操作问题。

原文地址:https://www.cnblogs.com/xiaoyaotx/p/13290161.html