ORM查询方式
ORM查询方法
<1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> order_by(*field): 对查询结果排序('-id') <6> reverse(): 对查询结果反向排序 <8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <9> first(): 返回第一条记录 <10> last(): 返回最后一条记录 <11> exists(): 如果QuerySet包含数据,就返回True,否则返回False <12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 <13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <14> distinct(): 从返回结果中剔除重复纪录
代码演示
from app01 import models
# 1.all() 查询所有数据
# 2.filter() 带有过滤条件的查询
# 3.get() 直接拿数据对象 但是条件不存在直接报错
# 4.first() 拿queryset里面第一个元素
# res = models.User.objects.all().first()
# print(res)
# 5.last()
# res = models.User.objects.all().last()
# print(res)
# 6.values() 可以指定获取的数据字段 select name,age from ... 列表套字典
# res = models.User.objects.values('name','age') # <QuerySet [{'name': 'jason', 'age': 18}, {'name': 'egonPPP', 'age': 84}]>
# print(res)
# 7.values_list() 列表套元祖
# res = models.User.objects.values_list('name','age') # <QuerySet [('jason', 18), ('egonPPP', 84)]>
# print(res)
# 8.distinct() 去重
# res = models.User.objects.values('name','age').distinct()
# print(res)
"""
去重一定要是一模一样的数据
如果带有主键那么肯定不一样 你在往后的查询中一定不要忽略主键
"""
# 9.order_by()
# res = models.User.objects.order_by('age') # 默认升序
# res = models.User.objects.order_by('-age') # 降序
#
# print(res)
# 10.reverse() 反转的前提是 数据已经排过序了 order_by()
# res = models.User.objects.all()
# res1 = models.User.objects.order_by('age').reverse()
# print(res,res1)
# 11.count() 统计当前数据的个数
# res = models.User.objects.count()
# print(res)
# 12.exclude() 排除在外
# res = models.User.objects.exclude(name='jason')
# print(res)
# 13.exists() 基本用不到因为数据本身就自带布尔值 返回的是布尔值
# res = models.User.objects.filter(pk=10).exists()
# print(res)
基于双下滑线的查询
Book.objects.filter(price__in=[100,200,300]) Book.objects.filter(price__gt=100) Book.objects.filter(price__lt=100) Book.objects.filter(price__gte=100) Book.objects.filter(price__lte=100) Book.objects.filter(price__range=[100,200]) Book.objects.filter(title__contains="python") Book.objects.filter(title__icontains="python") Book.objects.filter(title__startswith="py") Book.objects.filter(pub_date__year=2012)
代码演示
# 1. 查询书籍价格大于200的 # sql: select * from t1 where price > 200 # ORM:gt => greater than equal # res = models.Book.objects.filter(price__gt=200).all() # res = models.Book.objects.filter(price__gte=200).all() # 大于等于 # print(res) #2. 查询书籍价格小于200的 # res = models.Book.objects.filter(price__lt=200).all() # res1 = models.Book.objects.filter(price__lte=200).all() # 小于等于 # print(res) # print(res1) # 3. 查询书籍价格是111, 200的所有书籍 # sql:select * from t1 where price = 111 or price = 200 # sql:select * from t1 where price in (111, 200) # in走索引,not in 不走索引 # res = models.Book.objects.filter(price__in=[111, 200]).all() # print(res) # 4. 查询书籍价格在100-300之间的 # sql:select * from t1 where price >= 100 and price <= 300 # sql: select *from t1 where price between 100 and 300 # 顾头顾尾 # res = models.Book.objects.filter(price__range=[100, 300]).all() # print(res)
# 5. 查询书籍名称带有西的所有书籍 # like查询不走索引 # es: elasticsearch # sql:select * from t1 where title like '西%' # res = models.Book.objects.filter(title__contains='西').all() # 返回结果一定是queryset对象,才能点query属性 # print(res.query) # 查看SQL语句 # print(res) ''' select book.id, book.title from t1 create table db1.t (id int, name varchar(16)) ''' # 6. 查询以西开头的数据 res = models.Book.objects.filter(title__startswith='西').all() res = models.Book.objects.filter(title__endswith='西').all() # 7. 以时间查询: 2021-10 res = models.Book.objects.filter(create_time__year=2021, create_time__month=10)
查看SQL执行语句
如果想打印orm转换过程中的sql,需要在settings中进行如下配置:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }