Django中QuerySet的两大特性

查询集

查询集也称查询结果集,QuerySet,表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以含有零个,一个或多个过滤器。
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):

  • all():返回所有数据
  • filter():返回满足条件的数据
  • exclude():返回满足条件之外的数据
  • order_by():对结果进行排序

返回单个值的过滤器如下:

  • get():返回单个满足条件的对象
    • 若未找到会抛出DoesNotExist异常
    • 若找到多条会抛出MultipleObjectsReturned异常
  • count():返回当前查询结果的总条数
  • aggregate():聚合,返回一个字典

注:判断某一个查询集中是否有数据可以使用exists()方法,有则返回True,反之返回False

两大特性

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

    1
    2
    3
    4
    5
    6
    7
    # 执行下面的语句数据库并不会进行查询
    books = BookInfo.objects.all()

    # 只有当真正使用时,才会真正去数据库进行查询
    for b in books:
    print(b)

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

    1
    2
    3
    4
    5
    # 进行数据库实际查询遍历,保存结果到books,会进行数据库实际交互
    books = [b.id for b in BookInfo.objects.all()]

    # 再次调用books,不再进行数据库查询,而是使用缓存结果
    print(books)

    注:对查询集进行取下标或切片操作,等同于sql中的limit和offset