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',
        },
    }
}

 

posted @ 2022-03-02 17:05  那就凑个整吧  阅读(203)  评论(0编辑  收藏  举报