通过模型中的管理器构造一个查询集(QuerySet),来从数据库中获取对象。查询集表示从数据库中取出来的对象的集合。它可以含有零个、一个或者多个过滤器。过滤器基于所给的参数限制查询的结果。 从SQL 的角度,查询集SELECT语句等价,过滤器是像WHERE 和LIMIT 一样的限制子句。

可以从模型的管理器那里取得查询集。每个模型都至少有一个管理器,它默认命名为objects。通过模型类来直接访问它,像这样:

>>> Blog.objects
<django.db.models.manager.Manager object at ...>
>>> b = Blog(name='Foo', tagline='Bar')
>>> b.objects
Traceback:
...
AttributeError: "Manager isn't accessible via Blog instances."

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

查询集方法:

对于一个模型来说,管理器是查询集的主要来源。例如,Blog.objects.all() 返回包含数据库中所有Blog 对象的一个查询集。但往往我们需要进行筛选,all()不足以满足需求。所以需要在原始的查询集上增加一些过滤条件,常见的有

  • all():返回包含数据库表中所有记录的查询集,支持切片: Entry.objects.all()[5:10]
  • filter(**kwargs): 返回一个新的查询集,它包含满足查询参数的对象。  eg: Entry.objects.filter(pub_date__year=2006)
  • exclude(**kwargs):返回一个新的查询集,它包含不满足查询参数的对象。 eg: Entry.objects.filter(pub_date__year=2006).exclude.(pub_date__gte=datetime.date.today())    链式
  • get()方法:返回满足要求的一个对象,使用get()和filter()切片[0]的方法有点区别,如果不满足查询要求则get()将引发DoesNotExit异常。类似的,如有多条记录满足查询条件则也报错。
one_entry = Entry.objects.get(pk=1)   # 查询主键为1的记录,如没有主键为1的Entry对象,则引发Entry.DoesNotExit

除all(),filter()...外,还有很多查询集方法,可在官方文档查询集API参考查阅。

查询集方法的参数:

字段查询通过查询集方法filter()...的关键字参数来指定。查询的关键字参数的基本形式为field__lookuptype=value(字段名后有两个下划线!)

Entry.objects.filter(pub_date__lte='2006-01-01')
Entry.objects.filter(blog_id=4) #特别的,对于ForeignKey可以用字段名加上_id后缀,此时参数的值为外键的原始值
Entry.objects.get(headline__exact="Man bites dog")  # exact表示精确匹配,若你只提供字段名headline,则默认为exact,即等价于Entry.objects.get(headline="Man bites dog")
Blog.objects.get(name__iexact="beatles blog")  # iexact表示大小写不敏感匹配  "Beatles Blog""beatles blog"都会被匹配上。
Entry.objects.get(headline__contains='Lennon')  # contains为大小写敏感的包含关系测试 注意,这将匹配'Today Lennon honored' 但不能匹配'today lennon honored'

看完上面的例子,此外还有icontains表示大小写不敏感包含关系,startswith 和 endswith分别为以XXX和XXX开头结尾,当然大小写不敏感版本istartswith,iendswith。

查询的快捷方式pk:

为了方便,Django 提供一个查询快捷方式pk ,它表示“primary key” 的意思。eg:在Blog模型中主键为id字段,所以以下三条语句等价。

Blog.objects.get(id__exact=14) # Explicit form
Blog.objects.get(id=14) # __exact is implied
Blog.objects.get(pk=14) # pk implies id__exact

pk 的使用不仅限于__exact 查询 —— 任何查询类型都可以与pk 结合来完成一个模型上对主键的查询:

# Get blogs entries with id 1, 4 and 7
>>> Blog.objects.filter(pk__in=[1,4,7]) # Get all blog entries with id > 14
>>> Blog.objects.filter(pk__gt=14)

参考:官方文档查询

官方文档查询集

Django 查询集简述的更多相关文章

  1. django查询集API

    本节将详细介绍查询集的API,它建立在下面的模型基础上,与上一节的模型相同: from django.db import models class Blog(models.Model): name = ...

  2. django查询集-17

    当查询结果是多个的时候,django-ORM会返回一个 查询集(QuerySet) ,表示从数据库中获取对象的 集合 . 查询集可以使用过滤器进行再次处理. 例如查询阅读量大于20且评论数大于30的书 ...

  3. django 查询集 API

    filter 表示=, 返回一个新的QuerySet,包含与给定的查询参数匹配的对象.exclude 表示!=. 返回一个新的QuerySet,它包含不满足给定的查找参数的对象. annotate 使 ...

  4. Django 查询集的过滤内置条件

    条件选取querySet的时候,filter表示=,exclude表示!=.querySet.distinct() 去重复__exact 精确等于 like 'aaa' __iexact 精确等于 忽 ...

  5. 查询集API -- Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  6. Django 聚合与查询集API实现侧边栏

    本文从Django官方文档总结而来,将聚合的主要用法和查询集的常见方法做一归纳. 聚合 1. 聚合的产生来源于django数据库查询,通常我们使用django查询来完成增删查改,但是有时候需要更复杂的 ...

  7. django 过滤器-查询集-比较运算符-FQ对象-mysql的命令窗口

    """ 返回查询集的方法称为过滤器 all() 返回查询集中所有数据 filter() 返回符合条件的数据 一.filter(键=值) 二.filter(键=值,键=值) ...

  8. Django框架(六):模型(二) 字段查询、查询集

    1. 字段查询 通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询. 函数名 功能 返回值 说明 get 返回表中满足条件的一条且只能有一条数据. 返回值是一个模型类对象. ...

  9. django的查询集

    查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以含有零个.一个或多个过滤器.过滤器基于所给的参数限制查询的结果,从Sql的角度,查询集和select语句等价,过 ...

随机推荐

  1. 洛谷P2900 [USACO08MAR]土地征用Land Acquisition(动态规划,斜率优化,决策单调性,线性规划,单调队列)

    洛谷题目传送门 用两种不一样的思路立体地理解斜率优化,你值得拥有. 题意分析 既然所有的土地都要买,那么我们可以考虑到,如果一块土地的宽和高(其实是蒟蒻把长方形立在了平面上)都比另一块要小,那么肯定是 ...

  2. Java核心技术-具体的集合

    除了Map结尾的类之外,其他都实现了Collection接口,而以Map结尾的类实现了Map接口. 链表 在Java程序设计语言中,所有链表实际上都是双向链表的(double linked)--即每个 ...

  3. Java中线程池的实现原理-求职必备

    jdk1.5引入Executor线程池框架,通过它把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行.被哪个线程执行,以及什么时候执行. 初始化线程池(4种) ...

  4. 【loj3043】【zjoi2019】线段树

    题目 描述 ​ 有\(m\)个操作一次发生,每个操作有\(\frac{1}{2}\)的概率被执行 ; ​ 一次操作为线段树([1,n])上的 \(modify(Node,l,r,ql,qr)\) ; ...

  5. TRIE 字典树 前缀紧急集合!

    TRIE: 在计算机科学中,Trie,又称前缀树或字典树,是一种有序树状的数据结构,用于保存关联数组,其中的键通常是字符串.——百度百科 自我理解: trie树,是一种处理字符串前缀的数据结构,通常会 ...

  6. 【POJ2248】加法链 idfs

    首先,在这道题的搜索框架中,在对每一位进行枚举时,复杂度为\(O(n^2)\),但是可知最优解序列的长度不会太长. 其次,采用 \(bool\) 类型返回值时,是一种存在性搜索,并不一定能够得到最优解 ...

  7. 集合类(常见的集合类:Collection、List、Set、ArrayList、linkedList、Vector、HashSet、TreeSet)

    一.集合类 定义:一种为了对多个对象进行操作而进行存储的方式. 1.与数组的区别: 数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,数组长度固定. 集合:只能存储对象,长度可变, ...

  8. OpenCV 无法启动此程序,因为计算机中丢失opencv_core249.dll。请尝试重新安装改程序已解决此问题

    换了64位的系统,配置好之后运行之前的程序,竟然给我抛出这个错误.应该是我的opencv没有安装对吧.系统报错 无法启动此程序,因为计算机中丢失opencv_core249.dll.请尝试重新安装改程 ...

  9. Arraylist集合遍历输出

    题目:创建一个只能容纳String对象名为names的Arraylist集合,按顺序向集合中添加5个字符串对象.对集合进行遍历,打印出集合中每个元素的位置与内容.首先打印出集合的大小,然后删除集合中的 ...

  10. Kubernetes Ingress管理

    目录 Ingress介绍 1.Pod漂移问题 2.端口管理问题 3.域名分配及动态更新问题 Nginx Ingress配置 1.部署默认后端 2.部署Ingress Controller 3.部署In ...