数据库基本操作(查询)

一、查询对象

从数据库里检索对象,可以通过模型的Manage来建立QuerySet,一个QuerySet表现为一个数据库中对象的结合,他可以有0个一个或多个过滤条件,在SQL里QuerySet相当于select语句用where或limit过滤。你通过模型的Manage来获取QuerySet,每个模型至少有一个Manage

注:Managers只可以通过模型的类访问,而不可以通过模型的实例访问,目的是为了强制区分“表级别”的操作和“记录级别”的操作

二、返回QuerySet对象

要检索数据库中的对象,就要为你的model 类构造一个查询集QuerySet。一个QuerySet就代表数据库中的一组数据。它可以有一个或很多个,也可以通过filter根据给定的参数对数据集做进一步筛选。在SQL术语中,QuerySet相当于SELECT语句,filter相当于WHERE或LIMIT这样的限定从句

1、all

  1. 方法

    all()[]
    
  2. 说明

    查询所有信息 支持切片操作,切片只支持正整数,索引从0开始

  3. 示例代码

    #  不触发数据库操作
    users = UserInfo.objects.all()
    for user in users:# 触发数据库操作print(user.username)
    # 切片操作 触发数据库操作
    # 获取第11条数据
    users = UserInfo.objects.all()[10]
    # 获取前5条数据
    users = UserInfo.objects.all()[0:5]
    # 获取第1条到第10条数据
    users = UserInfo.objects.all()[1:10]users = UserInfo.objects.all()[0:10:2]
    

2、filter

  1. 方法

    filter(**kwargs)
    
  2. 说明

    返回一个QuerySet,包含满足查询参数的对象

  3. 参数

    • **kwargs

      查询的参数,where后面的条件

  4. 示例代码

    UserInfo.objects.filter(username='小明')
    

3、exclude()

  1. 方法

    exclude(**kwargs)
    
  2. 说明

    反向查询,指返回查询条件相反的对象

  3. 参数

    • **kwargs

      查询的参数,where后面的条件

  4. 示例代码

    UserInfo.objects.exclude(username='小明')
    

4、order_by()

  1. 方法

    order_by(**kwargs)
    
  2. 说明

    对结果集进行升序或降序,可指定需要排序的字段。

  3. 参数f

    • **kwargs

      查询的参数,order by后面的字段

  4. 示例代码

    # 升序
    UserInfo.objects.filter().order_by('create_date')
    # 降序
    UserInfo.objects.filter().order_by('-create_date')
    # 随机排序(开发中不要使用)
    UserInfo.objects.order_by('?create_date')
    

5、values()

  1. 方法

    values(**kwargs,**expressions)
    
  2. 说明

    • 当作为迭代器使用时,返回一个返回字典,而不是模型实例。
    • 该values()方法采用可选的位置参数,*fields它指定SELECT应限制的字段名称。如果指定了字段,每个字典将仅包含指定字段的字段键/值。如果不指定字段,则每个字典将包含数据库表中每个字段的键和值
    • 该values()方法还包含可选的关键字参数 **expressions
  3. 参数

    • **kwargs

      过滤的列

    • **expressions

      关键字参数 例如常见的:Lower(值转化成小写), Upper(值转化成大写), Length(计算值的长度)

  4. 示例代码

    UserInfo.objects.all().values()
    #指定字典
    UserInfo.objects.all().values('username')
    # 可选关键字
    from django.db.models.functions import Lower, Upper, Length
    objects.values(lower=Lower('username'))
    objects.values(lower=Upper('username'))
    objects.values(lower=length('username'))
    

6、values_list()

  1. 方法

    values_list(*fields,flat=False)
    
  2. 说明

    返回列表,每个元组都包含传入values_list()调用的相应字段或表达式的值,

  3. 参数

    • *fields

      过滤在的字段

    • flat

      bool类型,默认是False,

      如果只传入单个字段,则还可以传入 flat 参数设置为True,这将意味着返回的结果是单值,而不是一元组。

  4. 示例代码

    # 查询所有字段的值
    users = UserInfo.objects.all().values_list()
    # 查询单值字段的值
    users = UserInfo.objects.values_list('username', flat=True)
    # 查询指定字段的值
    users = UserInfo.objects.values_list('uid', 'username')
    # 如果想查询单条记录可以
    users = UserInfo.objects.values_list('uid', 'username').first()
    # 或者
    users = UserInfo.objects.values_list('uid', 'username').get(pk=1)
    

7、raw()

  1. 方法

    raw(str)
    
  2. 说明

    在模型查询API不够用的情况下,你可以使用原始的SQL语句。Django提供两种方法使用原始SQL进行查询:一种是使用Manager.raw()方法,进行原始查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的SQL语句。

    raw()接受一个原始的SQL查询,执行它并返回一个 django.db.models.query.RawQuerySet实例。这个RawQuerySet实例可以像正常一样迭代QuerySet以提供对象实例。

  3. 参数说明

    • str

      原生sql语句

  4. 示例代码

    raw = UserInfo.objects.raw('select * from UserInfo where username = '%s' ORDER BY id desc' % name)
    #通过raw方法查询的结果是一个RawQuerySet对象,如果想取到所有的值
    raw[0].__dict__
    #可以封装成方法
    def Serialization(objects) :'''_obj: objext -> list, Python 3.6新加入的特性, 用来标识这个方法接收一个对象并返回一个listorm.raw序列化'''_list = []_get = []for i in objects:_list.append(i.__dict__)for i in _list:del i['_state']_get.append(i)return _get
    

8、链式查询

  1. 说明

    类似jQuery的链式编程

  2. 示例代码

    users = UserInfo.objects.filter(username='test2').exclude(is_delete=True).filter(create_date=date(2018, 7, 5))
    # 等同
    # qt = UserInfo.objects.filter(username='test2')
    # qt = qt.exclude(is_delete=True)
    # qt = qt.filter(create_date=date(2018, 7, 5))
    

11、Q()

  1. 说明

    Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询。可以组合使用 &(and),|(or),~(not)操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象

    每个接受关键字参数的查询函数(例如filter()exclude()get())都可以传递一个或多个Q 对象作为位置(不带名的)参数。如果一个查询函数有多个Q 对象参数,这些参数的逻辑关系为“AND"

    注意:一定要把Q对象放在关键字参数查询的前面

  2. 示例代码

    # 查询 注册日期是2016-10-2 或者 2016-10-6日的所有用户信息
    users= UserInfo.objects.filter(Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6))
    )# 查询 用户名是xiaohong 和 没有注销的用户信息
    users= UserInfo.objects.filter(Q(username='xiaohong') & Q(is_delete=False)
    )
    

12、F()

  1. 说明

    允许Django在未实际链接数据的情况下具有对数据库字段的值的引用。通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交。F对象支持四则运算

  2. 示例代码

     # from django.db.models import FUserInfo.objects.update(num=F('num')+1)
    

三、不返回QuerySet对象

QuerySet方法结果集不返回QuerySet。这些方法不使用缓存。相反,他们每次查询都会调用数据库。

1、get()

  1. 方法

    get(**kwargs)
    
  2. 说明

    返回匹配给定查找参数的对象,该参数应采用字段查找中描述的格式

    如果没有找到给定参数的对象,则引发DoesNotExist异常。

    如果没有找多个给定参数的对象,则引发MultipleObjectsReturned异常。

  3. 参数说明

    **kwargs: 查询的参数

  4. 返回值

    模型对象

  5. 示例代码

    user = UserInfo.objects.get(uid=1)
    UserInfo.objects.get(id=1, username='xiaoming')
    

2、bulk_create()

  1. 方法

    bulk_create(objs, batch_size=None)
    
  2. 说明

    批量插入

  3. 参数说明

    • objs 批量插入的对象
    • batch_size 缓存多少 如果不设置,batch_size是objs的长度
  4. 返回值

    返回保存好的objs

  5. 示例代码

    user_list =[user1,user2,user3]
    user_list = User.objects.bulk_create(user_list)
    

3、count()

  1. 方法

    count()
    
  2. 说明

    返回总条数

  3. 参数说明

  4. 返回值

    整形

  5. 示例代码

    UserInfo.objects.count()
    UserInfo.objects.filter(uid gt =1).count()
    

4、last()

  1. 说明

    获取最后最后一条数据

5、first()

  1. 说明

    获取第一条数据

6、annotate()

  1. 方法

    annotate(*args,**kwargs)
    
  2. 说明

    分组函数,用于实现聚合group by查询 前面的values写的是谁,就group谁

  3. 参数说明

  4. 返回值

    通过计算得到的聚合值的字典

  5. 示例代码

    from django.db.models import Avg, Min, Max, Count, Sum
    # 按性别统计用户的总数
    #  SELECT `sex`, COUNT('count') AS `uid` FROM `user` GROUP BY `sex`,
    users = UserInfo.objects.values('sex').annotate(uid=Count('uid'))
    # SELECT `user`.`sex`, COUNT(`user`.`uid`) AS `uid`, AVG(`user`.`age`) AS `ages` FROM `user` GROUP BY `user`.`sex`,
    users = UserInfo.objects.values('sex').annotate(uid=Count('uid'), ages=Avg('age'))
    

7、aggregate()

  1. 方法

    aggregate(*args, **kwargs)
    
  2. 说明

    聚合函数

  3. 参数说明

    • Avg,
    • Min,
    • Max,
    • Count,
    • Sum
  4. 返回值

    通过计算得到的聚合值的字典

  5. 示例代码

    from django.db.models import Avg, Min, Max, Count, Sum
    users = UserInfo.objects.aggregate(uid=Count('uid'))
    

Django的数据库查询相关推荐

  1. DRF(django restframework)-数据库查询结果序列化

    先看下手动序列化的 # -*- coding: utf-8 -*- from django.shortcuts import render# Create your views here. from ...

  2. Django从理论到实战(part31)--Django数据库查询操作

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: Django数据库查询操作 查找是数据库操作中一个非常重要的技术,查询一般就是使用filter.exclude以及get三个 ...

  3. django之ORM查询操作(二)

    文章目录 查询集 基础条件查询--针对一个属性 F和Q对象 聚合函数 统计总的阅读量 关联查询 基础关联查询 内连接查询 自关联查询 查询集 查询集: 表示从数据库中获取的模型对象集合 在管理器上调用 ...

  4. Django的model查询操作 与 查询性能优化

    Django的model查询操作 与 查询性能优化 1 如何 在做ORM查询时 查看SQl的执行情况 (1) 最底层的 django.db.connection 在 django shell 中使用 ...

  5. django模型——数据库(二)

    模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...

  6. [Django ]Django 的数据库操作

    Django 的数据库操作 有之前的基础,那么我们就可以开始对数据库进行操作. 一.数据库配置 配置 MySql 在主目录的 settings.py 中修改 Python 1 2 3 4 5 6 7 ...

  7. Django聚合分组查询(F与Q查询|ORM查询优化|常见字段参数)

    文章目录 一.正反向查询进阶操作 二.聚合查询 三.分组查询 四.ORM再次添加字段 五.F与Q查询 五.ORM查询优化 六.事务操作 七.模型层常见字段 八.ORM常见字段参数 九.多对多三种创建方 ...

  8. Django操作数据库

    文章目录 Django操作数据库 Django访问流程 空项目结构 ASGI和WSGI区别 HelloWord views和url配置 目录 讲解 效果 模板 模板应用实例 目录结构 新建html文件 ...

  9. 11. django多表查询part1

    django多表查询part1 一.多表操作之模型创建 1.多张表的关系: 2. models.py中建立出来 3.同步到mysql数据库 4. 注意点: 二.一对多添加表记录 三.多对多添加.修改. ...

最新文章

  1. 2022-2028年中国气相防锈薄膜行业市场发展调研及投资前景分析报告
  2. The total number of locks exceeds the lock table s
  3. 青龙羊毛——鸡厂签到
  4. Spring 进阶二
  5. 中非谋定农业合作 -农业大健康·万祥军:提供农业解决方案
  6. 杰尼亚签约第四范式 开启奢侈品行业智慧零售新思路
  7. MyBatis 流式查询
  8. linux 设备驱动程序开发 第3版_Chapter2_The Current Process
  9. angular9获取id_Angular2获取点击的元素ID
  10. P4357-[CQOI2016]K远点对【K-Dtree】
  11. Android之Activity框架
  12. 解决“在eclipse中配置Tomcat时,出现Cannot create a server using the selected type的错误”的问题...
  13. 彻底理解position与anchorPoint - Wonderffee's Blog(转)
  14. 3.2 如何判断Java对象的存活
  15. C语言最全爱心代码大全
  16. 地理空间数据云DEM数据解压失败_解决了
  17. c语言超市选址问题实验报告,单仓库设施选址决策方法(重心法,C语言代码)
  18. 动手实践感受下企业微信的网页授权登录、扫码授权登录
  19. VL2 异步复位的串联T触发器
  20. 文件分割与合并(Java)

热门文章

  1. la是什么牌子_la是什么牌子,值得购买吗?
  2. Layui transfer
  3. 化学元素怎么用html来书写、化学元素怎么写
  4. elementUI form表单使用validateField方法校验部分表单
  5. 60-基于51单片机简易电子琴设计
  6. 什么是限流及如何限流
  7. Hive-HQL语句调优
  8. 35java游戏_Java 7.35 游戏:猜字游戏(C++Java)
  9. MySQL 删除表数据,重置自增 id 为 0 的两个方式
  10. 医疗器械与知识产权保护