模型objects:这个对象是 django.db.model.manager.Manger 的对象,这个类是一个空壳类,它上面的所有方法都是从 QuerySet 这个类中拷贝过来的。

 >>>from django.db.models.manager import Manager

 def index(request):
print(type(Book.objects))
# objects:class Manager(BaseManager.from_queryset(QuerySet)):
# pass
return HttpResponse('index') # >>> <class 'django.db.models.manager.Manager'>

QuerySet方法:

  1. get:只能匹配一条数据,返回符合条件的模型而不是QuerySet对象;
  2. filter :将满足条件的数据提取出来,返回一个新的 QuerySet 。

  3. exclude :排除满足条件的数据,返回一个新的 QuerySet 。
    Book.objects.exclude(title__contains='hello')
  4. annotate :给 QuerySet 中的每个对象都添加一个使用查询表达式(聚合函数、 F表达式、 Q表达式、 Func表达式等)的新字段。
    articles = Article.objects.annotate(author_name=F("author__name"))

    以上代码将在每个对象中都添加一个  author__name  的字段,用来显示这个文章的作者的年龄。

  5. order_by :指定将查询的结果根据某个字段进行排序。如果要倒叙排序,那么可以在这个字段的前面加一个负号。
     # 根据创建的时间正序排序
    articles = Article.objects.order_by("create_time")
    # 根据创建的时间倒序排序
    articles = Article.objects.order_by("-create_time")
    # 根据作者的名字进行排序
    articles = Article.objects.order_by("author__name")
    # 首先根据创建的时间进行排序,如果时间相同,则根据作者的名字进行排序
    articles = Article.objects.order_by("create_time",'author__name')
     # 还可根据annotate定义的字段进行排序, 如实现图书的销量进行排序;先获取每本书的bookorder_id数量再排序;
    books = Book.objects.annotate(order_nums=Count("bookorder")).order_by("-order_nums")
    for book in books:
    print("%s:%s" % (book.name,book.order_nums))
     # 多个order_by会根据作者的名字进行排序,而不是使用文章的创建时间。
    articles = Article.objects.order_by("create_time").order_by("author__name") #可在“Bookorder” 模型的“Meta”类中定义“ordering”的默认排序;
    class Meta:
    ordering = ['create_time','-price']
  6. values:只提取想要的字段,而不是全部内容;返回值为 QuerySet 对象,是一个字典,而不是模型;
     def index1(requset):
    # value()不加参数时会获取所有字段及对应的值;
    # "author_name"为Book模型中author字段的name值;修改的名字不能跟模型原有字段冲突;
    books = Book.objects.values("id","name",author_name=F("author__name"))
    # >>> {'id': 1, 'name': '三国演义', 'author_name': '罗贯中'}... # 使用聚合函数形成一个新的字段;如图书的销售数量order_nums;
    books = Book.objects.values("id","name",order_nums=Count("bookorder"))
    for book in books:
    print(book)
    # >>> {'id': 1, 'name': '三国演义', 'order_nums': 3}...
    return HttpResponse('index1')
  7. value_list:与values类似,但装的不是字典,而是元组;
     def index1(requset):
    books = Book.objects.values_list("id","name")
    # >>> (1, '三国演义')... # flat=True:只有一个字段时可用;提取元组中的字段
    books = Book.objects.values_list("name",flat=True)
    for book in books:
    print(book)
    # >>> 三国演义...
    return HttpResponse('index1')
  8. defer、only:都返回一个QuerySet对象,且都是模型而不是字典:
    • defer:告诉ORM模型查询时过滤某些字段,过滤的字段再次使用时会重新发起请求;
    • only:查询数据时值提取某些字段,没加在only查询的字段使用时也会查询发起请求;
  9. select_related:查找某个表的数据时,可一次性把相关联的数据提取出来,为以后访问数据时,不用再次查找数据库,产生一个SQL查询语句,减少开支;只能用在外键的关联对象,用于一对一或一对多。
     def index(request):
    # books = Book.objects.all()
    books = Book.objects.select_related("author")
    for book in books:
    print(book.author.name)
    return HttpResponse("index")
  10. prefetch_related:用于多对一或者多对多,产生两个SQL查询语句;注意:使用时后面不能加filter等方法,会导致产生新的SQL语句;如需查询多个条件时需导入Prefetch模块;
     def index(requset):
    # 查找每本书籍及其销售的id;
    # 后加方法会使prefetch_related方法失效;
    # books = Book.objects.prefetch_related("bookorder_set")
    # for book in books:
    # print(book.name)
    # orders = book.bookorder_set.all()
    # for order in orders:
    # print(order.id) # 需导入“from django.db.models import Prefetch”来使用“Prefetch”模块对其集合进行查找;
    # 查找销售的书籍名及价格在90以上;
    prefetch = Prefetch("bookorder_set",queryset=Bookorder.objects.filter(price__gte=90))
    books = Book.objects.prefetch_related(prefetch)
    for book in books:
    print(book.name)
    orders = book.bookorder_set.all()
    for order in orders:
    print(order.id)
    return HttpResponse('index')
  11. create:创建一个数据并将数据保存到数据库中;
     def index(request):
    # 等价代码
    # publisher = Publisher(name="出版社3")
    # book.save()
    publisher = Publisher.objects.create("出版社3")
    return HttpResponse("index")
  12. get_or_create:如果给定的条件有数据,则提取该数据;如果没有,会先创建数据再提取出来;
     def index(requset):
    publisher = Publisher.objects.get_or_create(name="出版社4")
    return HttpResponse('index')
  13. bulk_create:一次性创建多条数据;
     def index(requset):
    publisher = Publisher.objects.bulk_create([
    publisher(name="出版社5"),
    publisher(name="出版社6"),
    ])
    return HttpResponse('index')
  14. count:获取数据的个数;
  15. first、last:返回QuerySet的第一条或最后一条数据;

      

  16. exists:判断某个条件的数据是否存在;
     if Book.objects.filter(name="三国演义").exists()
    print(True)
  17. distinct:去除掉重复的数据,如果底层数据库用的是MySQL,则不能传递参数
     books = Book.objects.filter(bookorder__price__gte=80).distinct()
    for book in books:
    print(book) # 使用order_by会使distinct根据多个字段进行唯一化,所以不会删除重复数据;
    # books = Book.objects.filter(bookorder__price__gte=80).order_by("bookorder__price").distinct()
  18. update:一次性更新所有数据;
     books = Book.objects.update(price=F("price")+5)
    # books = Book.objects.all()
    # for book in books:
    # book.price = book.price + 5
    # book.save()
  19. delete:一次性把所有满足条件的数据删除,需注意on_delete指定的处理方式;

切片操作: books = Book.objects.all()[0:2] # Book.objects.get_queryset()[0:1]

  • Django将QuerySet装换为SQL语句的5种情况:
    1. 迭代:遍历QuerySet对象时,会先执行SQL语句,再把结果返回进行迭代。  for book in books: # books = Books.objects.all() ;
    2. 使用步长做切片操作:QuerySet可像列表一样做切片操作。切片操作不会执行SQL语句,需提供步长。后不能再执行filter方法;
    3. 调用len函数:获取QuerySet总共获取多少条数据也会执行SQL语句;
    4. 调用list函数:将一个QuerySet对象转换为list对象会执行SQL语句;
    5. 判断:对某个QuerySet进行判断,也会执行SQL语句。

QuerySet API的更多相关文章

  1. python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

    python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...

  2. Django QuerySet API文档

    在查询时发生了什么(When QuerySets are evaluated) QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作.只要你查询的时候才真正的操作数据 ...

  3. Django之路:QuerySet API,后台和表单

    一.Django QuerySet API Django模型中我们学习了一些基本的创建和查询.这里专门讲以下数据库接口相关的接口(QuerySet API),当然你也可以选择暂时跳过这节.如果以后用到 ...

  4. Django-models & QuerySet API

    django中配置mysql数据库 1,首先配置settings.py. 一是在INSTALLED_APPS里面加入app名称: 二是配置数据库相关信息 INSTALLED_APPS = [ 'dja ...

  5. [py]django强悍的数据库接口(QuerySet API)-增删改查

    django强悍的数据库接口(QuerySet API) 4种方法插入数据 获取某个对象 filter过滤符合条件的对象 filter过滤排除某条件的对象- 支持链式多重查询 没找到排序的 - 4种方 ...

  6. Django——Django中的QuerySet API 与ORM(对象关系映射)

    首先名词解释. ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型 ...

  7. Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API

    用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...

  8. Django(19)QuerySet API

    前言 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作.其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager ...

  9. Python Django orm操作数据库笔记之QuerySet API

    什么时候Django会将QuerySet转换为SQL去执行: 根据Django的数据库机制,对于QuerySet来说,当QuerySet被第一次构建,然后又调用他的filter方法,接着在对其进行切片 ...

随机推荐

  1. MySQL数据查询

    数据查询语言DQL select [all | distinct] 字段或表达式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [ ...

  2. Consul部署架构

    Consul 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接,用于实现分布式系统的服务发现与配置. 应用Consul提供的服务需要建立Consul集群.在Consul方案中,每个 ...

  3. php 延迟静态绑定: static关键字

    abstract class DomainObject { public static function create() { return new self(); } } class User ex ...

  4. day19:常用模块(collections,time,random,os,sys)

    1,正则复习,re.S,这个在用的最多,re.M多行模式,这个主要改变^和$的行为,每一行都是新串开头,每个回车都是结尾.re.L 在Windows和linux里面对一些特殊字符有不一样的识别,re. ...

  5. springboot 2.0部署到Tomat8.5上

    1.改jar为war 2.改下打包的名字 3.删掉tomcat的webapps下面的所有文件夹.将打好的jar包放入到webapps下 4.运行tomcat,双击shutdown.bat 注意: sp ...

  6. REST风格的5条关键原则

    REST风格的5条关键原则包括: (1)网络上的所有事物都被抽象为资源. (2)每个资源对应一个唯一的资源标识. (3)通过通用的连接件接口对资源进行操作. (4)对资源的各种操作不会改变资源标识. ...

  7. 解决Kettle ETL数据乱码

    首先用insert语句插入一条数据试试是否因为MySQL编码不对引起,如果是MySQL原因,修改MySQL编码即可: 如果不是因为MySQL的编码导致问题,那么在Kettle的表输出中,编辑连接-选项 ...

  8. C#基础加强(4)之秒懂IL、CTS、CLS和CLR

    IL(Intermediate Language) 中间语言..Net 平台下不只有 C# 语言,还有 VB.Net.F# 等语言.IL 是程序最终编译的可执行二进制代码(托管代码),类似于 Java ...

  9. Docker:镜像构建与进入容器总结

    构建镜像总结 docker构建镜像有两种方法: 1.使用docker commit + 容器 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] ...

  10. C#设计模式(2)——简单工厂模式(转)

    C#设计模式(2)——简单工厂模式   一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...