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

1 >>>from django.db.models.manager import Manager
2
3 def index(request):
4     print(type(Book.objects))
5     #  objects:class Manager(BaseManager.from_queryset(QuerySet)):
6     #               pass
7     return HttpResponse('index')
8
9     # >>> <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 :指定将查询的结果根据某个字段进行排序。如果要倒叙排序,那么可以在这个字段的前面加一个负号。
    1 # 根据创建的时间正序排序
    2 articles = Article.objects.order_by("create_time")
    3 # 根据创建的时间倒序排序
    4 articles = Article.objects.order_by("-create_time")
    5 # 根据作者的名字进行排序
    6 articles = Article.objects.order_by("author__name")
    7 # 首先根据创建的时间进行排序,如果时间相同,则根据作者的名字进行排序
    8 articles = Article.objects.order_by("create_time",'author__name')

    1 # 还可根据annotate定义的字段进行排序, 如实现图书的销量进行排序;先获取每本书的bookorder_id数量再排序;
    2 books = Book.objects.annotate(order_nums=Count("bookorder")).order_by("-order_nums")
    3 for book in books:
    4     print("%s:%s" % (book.name,book.order_nums))

    1 # 多个order_by会根据作者的名字进行排序,而不是使用文章的创建时间。
    2 articles = Article.objects.order_by("create_time").order_by("author__name")
    3
    4 #可在“Bookorder” 模型的“Meta”类中定义“ordering”的默认排序;
    5 class Meta:
    6     ordering = ['create_time','-price']

  6. values:只提取想要的字段,而不是全部内容;返回值为 QuerySet 对象,是一个字典,而不是模型;
     1 def index1(requset):
     2     # value()不加参数时会获取所有字段及对应的值;
     3     # "author_name"为Book模型中author字段的name值;修改的名字不能跟模型原有字段冲突;
     4     books = Book.objects.values("id","name",author_name=F("author__name"))
     5     # >>> {'id': 1, 'name': '三国演义', 'author_name': '罗贯中'}...
     6
     7     # 使用聚合函数形成一个新的字段;如图书的销售数量order_nums;
     8     books = Book.objects.values("id","name",order_nums=Count("bookorder"))
     9     for book in books:
    10         print(book)
    11     # >>> {'id': 1, 'name': '三国演义', 'order_nums': 3}...
    12     return HttpResponse('index1')

  7. value_list:与values类似,但装的不是字典,而是元组;
     1 def index1(requset):
     2     books = Book.objects.values_list("id","name")
     3     # >>> (1, '三国演义')...
     4
     5     # flat=True:只有一个字段时可用;提取元组中的字段
     6     books = Book.objects.values_list("name",flat=True)
     7     for book in books:
     8         print(book)
     9     # >>> 三国演义...
    10     return HttpResponse('index1')

  8. defer、only:都返回一个QuerySet对象,且都是模型而不是字典:
    • defer:告诉ORM模型查询时过滤某些字段,过滤的字段再次使用时会重新发起请求;
    • only:查询数据时值提取某些字段,没加在only查询的字段使用时也会查询发起请求;
  9. select_related:查找某个表的数据时,可一次性把相关联的数据提取出来,为以后访问数据时,不用再次查找数据库,产生一个SQL查询语句,减少开支;只能用在外键的关联对象,用于一对一或一对多。
    1 def index(request):
    2     # books = Book.objects.all()
    3     books = Book.objects.select_related("author")
    4     for book in books:
    5         print(book.author.name)
    6     return HttpResponse("index")

  10. prefetch_related:用于多对一或者多对多,产生两个SQL查询语句;注意:使用时后面不能加filter等方法,会导致产生新的SQL语句;如需查询多个条件时需导入Prefetch模块;
     1 def index(requset):
     2     # 查找每本书籍及其销售的id;
     3     # 后加方法会使prefetch_related方法失效;
     4     # books = Book.objects.prefetch_related("bookorder_set")
     5     # for book in books:
     6     #     print(book.name)
     7     #     orders = book.bookorder_set.all()
     8     #     for order in orders:
     9     #         print(order.id)
    10
    11     # 需导入“from django.db.models import Prefetch”来使用“Prefetch”模块对其集合进行查找;
    12     # 查找销售的书籍名及价格在90以上;
    13     prefetch = Prefetch("bookorder_set",queryset=Bookorder.objects.filter(price__gte=90))
    14     books = Book.objects.prefetch_related(prefetch)
    15     for book in books:
    16         print(book.name)
    17         orders = book.bookorder_set.all()
    18         for order in orders:
    19             print(order.id)
    20     return HttpResponse('index')

  11. create:创建一个数据并将数据保存到数据库中;
    1 def index(request):
    2     # 等价代码
    3     # publisher = Publisher(name="出版社3")
    4     # book.save()
    5     publisher = Publisher.objects.create("出版社3")
    6     return HttpResponse("index")

  12. get_or_create:如果给定的条件有数据,则提取该数据;如果没有,会先创建数据再提取出来;
    1 def index(requset):
    2     publisher = Publisher.objects.get_or_create(name="出版社4")
    3     return HttpResponse('index')

  13. bulk_create:一次性创建多条数据;
    1 def index(requset):
    2     publisher = Publisher.objects.bulk_create([
    3         publisher(name="出版社5"),
    4         publisher(name="出版社6"),
    5     ])
    6     return HttpResponse('index')

  14. count:获取数据的个数;
  15. first、last:返回QuerySet的第一条或最后一条数据;

      

  16. exists:判断某个条件的数据是否存在;
    1 if Book.objects.filter(name="三国演义").exists()
    2     print(True)

  17. distinct:去除掉重复的数据,如果底层数据库用的是MySQL,则不能传递参数
    1 books = Book.objects.filter(bookorder__price__gte=80).distinct()
    2     for book in books:
    3         print(book)
    4
    5 # 使用order_by会使distinct根据多个字段进行唯一化,所以不会删除重复数据;
    6 # books = Book.objects.filter(bookorder__price__gte=80).order_by("bookorder__price").distinct()

  18. update:一次性更新所有数据;
    1 books = Book.objects.update(price=F("price")+5)
    2 # books = Book.objects.all()
    3 # for book in books:
    4 #     book.price = book.price + 5
    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语句。

转载于:https://www.cnblogs.com/liqiongming/p/10534009.html

QuerySet API相关推荐

  1. Django QuerySet API文档

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

  2. 085:QuerySet API详解-defer和only

    QuerySet API详解-defer和only: defer :在一些表中,可能存在很多的字段,但是一些字段的数据量可能是比较庞大的,而此时你又不需要,比如我们在获取文章列表的时候,文章的内容我们 ...

  3. 093:QuerySet API详解-QuerySet转换为SQL的条件

    QuerySet API详解-QuerySet转换为SQL的条件: 生成一个 QuerySet 对象并不会马上转换为 SQL 语句去执行.比如我们获取 Book 表下所有的图书: books = Bo ...

  4. 092:QuerySet API详解-切片操作

    QuerySet API详解-切片操作: 切片操作:有时候我们查找数据,有可能只需要其中的一部分.那么这时候可以使用切片操作来帮我们完成. QuerySet 使用切片操作就跟列表使用切片操作是一样的. ...

  5. Pycharm开发Django项目QuerySet API

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

  6. Django QuerySet API 文档阅读(3):QuerySet定义(一)

    原文地址:​​​​​​QuerySet API reference | Django documentation | Django QuerySet有两个属性,ordered和db: ordered: ...

  7. python queryset_Django QuerySet API

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

  8. 数据库中QuerySet API

    原文地址:https://www.jianshu.com/p/b3185d7c05f8 一.配合字段查询使用的方法 all() all返回一个QuerySet,里面包含着是每一行的对象 fittler ...

  9. 【转】建立一个更高级别的查询 API:正确使用Django ORM 的方式

    这个就比较深入啦... http://www.oschina.net/translate/higher-level-query-api-django-orm 结论: 在视图和其他高级应用中使用源生的O ...

最新文章

  1. 看完这些能控制大脑的寄生虫,你会怀疑人类!
  2. Azure进阶攻略丨如何驾驭罢工的Linux虚机网卡?
  3. 微信小程序-canvas绘制文字实现自动换行
  4. tableau地图城市数据_Tableau 地图 | 无法识别的城市
  5. 菜鸟的Xamarin.Forms前行之路——绪言
  6. 计算机网络 --- 数据链路层aloha协议
  7. android调用fragment的方法,AndroidX下使用Activity和Fragment的变化
  8. Redis 写磁盘出错 Cannot allocate memory
  9. flutter text 自动换行_Flutter 即学即用——05 StatelessWidget vs StatefulWidget
  10. python时间格式化
  11. ubuntu jdk 安装 【转载】
  12. 斯坦福自然语言组的NLP及计算语言学的资料汇总
  13. 笛卡尔遗传规划Cartesian Genetic Programming (CGP)简单理解(1)
  14. 计算机组成原理第三章ppt,计算机组成原理第三章幻灯片(白中英版).ppt
  15. 亲戚关系关系算法java程序_python版亲戚关系计算器
  16. 利用SPI驱动12864液晶
  17. 一周新论文 | 2020年第13周 | 自然语言处理相关
  18. Mem Reduct——最专一的电脑清理软件
  19. 最新版谷歌浏览器的锚点小问题 用jquery做出ctrl+f的搜索效果
  20. 一个刚进入公司的初级java工程师

热门文章

  1. 全国计算机运用计算机绘图考试,计算机绘图试题及答案(一)
  2. python图片处理Image和skimage的不同
  3. keyup keydown @keydown.down.prevent
  4. vue3点击返回顶部
  5. 数据库mysql数据库笔试题_MySql数据库笔试题总结
  6. 效能度量,打通研发管理闭环
  7. three.js -- 光源类型
  8. Unity3D开发类似保龄球游戏
  9. 用vscode调试C语言程序
  10. JavaScript数学运算(取整,取余和取模)