什么是Django QuerySet?

58

当我这样做时,

>>> b = Blog.objects.all()
>>> b

我得到了这个:

>>>[<Blog: Blog Title>,<Blog: Blog Tile>]

当我查询变量 b 的类型时,

>>> type(b)

我得到了这个:

>>> <class 'django.db.models.query.QuerySet'>

这是什么意思?它是像dictlist等数据类型吗?

如果能给出一个构建类似于QuerySet的数据结构的例子将会很不错。

我想知道Django是如何构建那个QuerySet的(详细情况)。


1
你可以查看Django的源代码来了解更多细节。除此之外,QuerySet只是一个普通的对象,有时候表现得像一个列表而已。 - Deniz Dogan
关于它是什么:http://docs.djangoproject.com/en/dev/ref/models/querysets/ 关于它如何工作,就像之前提到的那样,请查看源代码。 - Felix Kling
这里是 Django 中 QuerySet 的定义:https://github.com/django/django/blob/master/django/db/models/query.py - Edward D'Souza
4个回答

69

Django 查询集(queryset),顾名思义,基本上是一组(sql)查询语句。在你上面的示例中,print(b.query) 将显示由你的 Django filter 调用生成的 sql 查询。

由于查询集是惰性求值的,所以数据库查询并不会立即执行,而是在需要时——即查询集被评估时——才会执行。这种情况例如在打印时调用其 __str__ 方法、调用 list() 方法或者最常见的是当你迭代它时 (for post in b..)。这种惰性求值能够节省你不必要的查询,并且允许你链接查询集和过滤器(例如,你可以对查询集进行多次过滤)。


14

14
仅提供链接作为答案?那是一个大忌讳... - o0'.

11
一个 QuerySet 表示来自数据库的对象集合。它可以有零个、一个或多个过滤器。基于给定参数,过滤器缩小了查询结果。按照 SQL 的术语,QuerySet 相当于 SELECT 语句,而 filter 则是限制子句,例如 WHERE 或 LIMIT。
参考链接:https://docs.djangoproject.com/en/1.8/topics/db/queries/

2

查询集是给定模型的对象列表,它允许你从数据库中读取数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接