最浅显易懂的Django系列教程(21)-QuerySet API

QuerySet API:

我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作。其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager这个类是一个“空壳”的类,他本身是没有任何的属性和方法的。他的方法全部都是通过Python动态添加的方式,从QuerySet类中拷贝过来的。示例图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SPeDlopA-1589436455513)(/assets/QuerySet和Manager.png)]
所以我们如果想要学习ORM模型的查找操作,必须首先要学会QuerySet上的一些API的使用。

返回新的QuerySet的方法:

在使用QuerySet进行查找操作的时候,可以提供多种操作。比如过滤完后还要根据某个字段进行排序,那么这一系列的操作我们可以通过一个非常流畅的链式调用的方式进行。比如要从文章表中获取标题为123,并且提取后要将结果根据发布的时间进行排序,那么可以使用以下方式来完成:

articles = Article.objects.filter(title='123').order_by('create_time')

可以看到order_by方法是直接在filter执行后调用的。这说明filter返回的对象是一个拥有order_by方法的对象。而这个对象正是一个新的QuerySet对象。因此可以使用order_by方法。

那么以下将介绍在那些会返回新的QuerySet对象的方法。

  1. filter:将满足条件的数据提取出来,返回一个新的QuerySet。具体的filter可以提供什么条件查询。请见查询操作章节。

  2. exclude:排除满足条件的数据,返回一个新的QuerySet。示例代码如下:

     Article.objects.exclude(title__contains='hello')
    

    以上代码的意思是提取那些标题不包含hello的图书。

  3. annotate:给QuerySet中的每个对象都添加一个使用查询表达式(聚合函数、F表达式、Q表达式、Func表达式等)的新字段。示例代码如下:

     articles = Article.objects.annotate(author_name=F("author__name"))
    

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

  4. 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')
    

    一定要注意的一点是,多个order_by,会把前面排序的规则给打乱,而使用后面的排序方式。比如以下代码:

     articles = Article.objects.order_by("create_time").order_by("author__name")
    

    他会根据作者的名字进行排序,而不是使用文章的创建时间。

  5. values:用来指定在提取数据出来,需要提取哪些字段。默认情况下会把表中所有的字段全部都提取出来,可以使用values来进行指定,并且使用了values方法后,提取出的QuerySet中的数据类型不是模型,而是在values方法中指定的字段和值形成的字典:

     articles = Article.objects.values("title",'content')
     for article in articles:
         print(article)
    

    以上打印出来的article是类似于{"title":"abc","content":"xxx"}的形式。
    如果在value

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值