1.查询基本格式及理解: 类名.objects.[查询条件]

  例如我们要查询数据库中一张表(bookinfo)的所有数据,sql语句为:select * from bookinfo,

  对应模型类的操作是: BookInfo.objects.all()

  cd到当前django项目的目录下,进入携带django环境的python解释器进行测试操作:

    $ python manage.py shell

    $ from book_app.models import *

  

  即可进行模型对象的语句语句操作,执行以下语句看看我们查询的到底是什么东西  

    $ type(BookInfo.objects)  -->  <class 'django.db.models.manager.Manager'>

    $ type(BookInfo.objects.all())  -->  <class 'django.db.models.manager.Manager.QuerySet'>

    $ type(BookInfo.objects.all()[0])  --> <class 'django.db.models.manager.Manager.BookInfo'>

  也就是说,objects是一个模块对象管理器,objects.all是一个查询集QuerySet,

  取查询集的第一个元素QuerySet[0],可以看到查询集里面存的元素就是符合条件的我们设计表时所创建类BookInfo的实例对象

  QuerySet查询集支持小标和切片,切片返回的是一个新的查询集

2.查询集之过滤器:

  多对象过滤器:

    all()  -->  返回所有数据

    filter([条件])  -->  返回满足条件的所有数据   

    exclude([条件])  -->  返回满足条件外的所有数据

    order_by([条件])  -->  根据条件排序,并返回  (可以用'-'实现倒序)  

  单对象过滤器:

    get([条件])  -->  返回满足条件的单个数据;如果未找到将抛出异常:DoesNotExist;如果找到的是多条将抛出异常:MultipleObjectsReturned

    count()  -->  返回查询结果总数

    aggregate()  --> 聚合,返回一个字典 (聚合函数:Avg、Max、Min、Sum、Count,例:  objects.aggregate(Sum("name")))

  判空:

    exists()  -->  判断查询集中是否有数据,有为True

  返回具体对象属性值:

    values([属性名])  -->  返回一个列表,以字典形式存放所有对象的属性值

    values_list([属性名])  -->  返回一个列表,以列表形式存放所有对象的属性值

3.filter查询集的条件查询:

  查询条件的格式:  [属性名称]__[运算符]=[值] (注意是两个"_",我们在对属性命名时不允许使用双"_")

  

  属性大小、范围查询:

    等于:属性=值  大于:属性__gt=值  大于等于:属性__gte=值  

    小于:属性__lt=值  小于等于:属性__lte=值  范围:属性_in=值(值应为可选项的列表,例: id_in=[1,3,5],指定id=1、3、5的3个数据)

  查询属性为空的/不为空:

    属性__isnull=True/False

  属性模糊查询:

    指定开头:属性__startwith=值  指定结尾:属性__endwith=值

    指定日期(属性值应为日期相应类型):属性_year=值  属性_month=值(例:birthday_month=11,指定birthday的月份为11月的数据)

  F对象和Q对象:  需先导入: from django.db.models import F,Q

    F对象:不知道某个属性的值,也可以用它来进行比较,例: filter(read_gt=F('comment')*2), 查询阅读数量大于评论数量2倍的数据

    Q对象:实现逻辑与、非的查询

        与:  objects.filter(read_gt=20).filter(comment_gt=20)  阅读和评论数都大于20

        或:  objects.filter(Q(read_gt=20 | comment_gt=20))  阅读数大于20或评论数大于20

        非:  objects.filter(-Q(read_gt=20))  阅读数不大于20

4.过滤器的特性:懒惰和缓存

  懒惰:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用等

  缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用这个查询集时会使用缓存的数据。

  

  

     

 


Django项目的ORM操作之--模型类数据查询的更多相关文章

  1. Django项目的ORM操作之--数据模型类创建

    在django项目中,其自带了ORM(Object Relation Mapping)对象关系映射框架,我们在django项目下app的models模块下对类进行操作,通过ORM会将我们对类的操作转化 ...

  2. Django学习之ORM操作

    一.一般操作 二.必知必会13条 返回QuerySet对象的方法有 特殊的QuerySet 返回具体对象的 返回布尔值的方法有 返回数字的方法 三.单表查询之神奇的双下划线 四.ForeignKey操 ...

  3. Django专题之ORM操作2

    Django ORM操作   目录 一般操作 看专业的官网文档,做专业的程序员! 回到顶部 必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs ...

  4. 跨过Nginx上基于uWSGI部署Django项目的坑

    先说说他们的关系,Nginx和uWSGI都是Web服务器,Nginx负责静态内容,uWSGI负责Python这样的动态内容,二者配合共同提供Web服务以实现提高效率和负载均衡等目的.uWSGI实现了多 ...

  5. Python/Django(CBV/FBV/ORM操作)

    Python/Django(CBV/FBV/ORM操作) CBV:url对应的类(模式) ##====================================CBV操作============ ...

  6. Django - 表与ORM操作

    Django - 表与ORM操作 一. 模板语言 模板中也有自己的语言, 该语言可以实现数据展示 - {{ 变量 }} - 循环 {% for i in all_publisher %} {{ for ...

  7. 初学Django基础02 ORM操作

    django的ORM操作 之前我们知道了models.py这个文件,这个文件是用来读取数据结构的文件,每次操作数据时都走这个模块 常用字段 AutoField int自增列,必须填入参数 primar ...

  8. docker笔记(3) ------Django项目的docker部署

    2019-01-12   14:23:18 django容器连接到mysql_server容器分析:原myblog项目使用sqlit3数据库,使用mysql容器前需要在django中加入pymysql ...

  9. Django基础之ORM操作

    ################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...

随机推荐

  1. OpenStack之基础知识

    一.云计算 云计算(cloud computing)是基于互联网的相关服务的增加.使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源.云是网络.互联网的一种比喻说法.过去在图中往往 ...

  2. elasticsearch 5.x集群安装

    1. 下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.tar.gz 2. 解压 为便于 ...

  3. Android系统启动过程[典☆☆☆]

    Android系统启动过程 首先Android框架架构图:(来自网上,我觉得这张图看起来很清晰) Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用. 启动 ...

  4. 批处理命令 For循环命令详解!

    批处理for命令详解FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能!看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)FOR 参数 %%变量名 IN (相关文 ...

  5. RabbitMQ入门(5)——主题(Topic)

    前面我们介绍了通过使用direct exchage,改善了fanout exchange只能进行虚拟广播的方式.尽管如此,直接交换也有自身的局限,它不能基于多个条件路由. 在我们的日志系统中,也许我们 ...

  6. Linux 下的jdk安装

    Linux 下安装JDK1.8 https://www.cnblogs.com/xuliangxing/p/7066913.html http://www.oracle.com/technetwork ...

  7. 设计模式——适配器(Adapter)模式

    概述 什么是适配器?在我们生活中的适配器比如插头转换器(中标转美标).USB接口转换器(type-c转苹果),电脑电源适配器(交流电转低电压直流)等.像这种将两者有差异的东西通过适配器使他们成为相互适 ...

  8. “Too many open files” 小记

    pycharm远程链接centos7开发过程中突然遇到“Too many open files”. 几点记录: 1. 命令:ulimit -n 查看系统配置,其中的 表示每个进程最多能打开8192个文 ...

  9. Swoft 快速上手小贴士

    IDE一定要装注解插件PHP Annotations Request和Response里的with...开头的方法会clone $this, 而不是修改本实体, 所以设置Cookie之类的时候要$re ...

  10. 浏览器DOM操作

    HTML Node 节点 常用API 高效遍历 DOM Repaint and reflow 插入大量内容避免重绘和回流 style 样式操作 DOM事件 HTML - innerHTML:内部HTM ...