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,
字面意思很明显的就不多说了,这个还是正则的余孽啊,抽空复习一下正则
昨天加上今天,单表的增删改查就搞定了,明天开始多表的操作问题。