==========================
``QuerySet`` API reference
==========================
.. currentmodule:: django.db.models.query
This document describes the details of the ``QuerySet`` API. It builds on the
material presented in the :doc:`model </topics/db/models>` and :doc:`database
query </topics/db/queries>` guides, so you'll probably want to read and
understand those documents before reading this one.
Throughout this reference we'll use the :ref:`example blog models
<queryset-model-example>` presented in the :doc:`database query guide
</topics/db/queries>`.
.. _when-querysets-are-evaluated:
When ``QuerySet``\s are evaluated
=================================
Internally, a ``QuerySet`` can be constructed, filtered, sliced, and generally
passed around without actually hitting the database. No database activity
actually occurs until you do something to evaluate the queryset.
You can evaluate a ``QuerySet`` in the following ways:
* **Iteration.** A ``QuerySet`` is iterable, and it executes its database
query the first time you iterate over it. For example, this will print
the headline of all entries in the database::
for e in Entry.objects.all():
print(e.headline)
Note: Don't use this if all you want to do is determine if at least one
result exists. It's more efficient to use :meth:`~QuerySet.exists`.
* **Asynchronous iteration.** A ``QuerySet`` can also be iterated over using
``async for``::
async for e in Entry.objects.all():
results.append(e)
Both synchronous and asynchronous iterators of QuerySets share the same
underlying cache.
* **Slicing.** As explained in :ref:`limiting-querysets`, a ``QuerySet`` can
be sliced, using Python's array-slicing syntax. Slicing an unevaluated
``QuerySet`` usually returns another unevaluated ``QuerySet``, but Django
will execute the database query if you use the "step" parameter of slice
syntax, and will return a list. Slicing a ``QuerySet`` that has been
evaluated also returns a list.
Also note that even though slicing an unevaluated ``QuerySet`` returns
another unevaluated ``QuerySet``, modifying it further (e.g., adding
more filters, or modifying ordering) is not allowed, since that does not
translate well into SQL and it would not have a clear meaning either.
* **Pickling/Caching.** See the following section for details of what
is involved when `pickling QuerySets`_. The important thing for the
purposes of this section is that the results are read from the database.
* **repr().** A ``QuerySet`` is evaluated when you call ``repr()`` on it.
This is for convenience in the Python interactive interpreter, so you can
immediately see your results when using the API interactively.
* **len().** A ``QuerySet`` is evaluated when you call ``len()`` on it.
This, as you might expect, returns the length of the result list.
Note: If you only need to determine the number of records in the set (and
don't need the actual objects), it's much more efficient to handle a count
at the database level using SQL's ``SELECT COUNT(*)``. Django provides a
:meth:`~QuerySet.count` method for precisely this reason.
* **list().** Force evaluation of a ``QuerySet`` by calling ``list()`` on
it. For example::
entry_list = list(Entry.objects.all())
* **bool().** Testing a ``QuerySet`` in a boolean context, such as using
``bool()``, ``or``, ``and`` or an ``if`` statement, will cause the query
to be executed. If there is at least one result, the ``QuerySet`` is
``True``, otherwise ``False``. For example::
if Entry.objects.filter(headline="Test"):
print("There is at least one Entry with the headline Test")
Note: If you only want to determine if at least one result exists (and don't
need the actual objects), it's more efficient to use :meth:`~QuerySet.exists`.
.. _pickling QuerySets:
Pickling ``QuerySet``\s
-----------------------
If you :mod:`pickle` a ``QuerySet``, this will force all the results to be loaded
into memory prior to pickling. Pickling is usually used as a precursor to
caching and when the cached queryset is reloaded, you want the results to
already be present and ready for use (reading from the database can take some
time, defeating the purpose of caching). This means that when you unpickle a
``QuerySet``, it contains the results at the moment it was pickled, rather
than the results that are currently in the database.
If you only want to pickle the necessary information to recreate the
``QuerySet`` from the database at a later time, pickle the ``query`` attribute
of the ``QuerySet``. You can then recreate the original ``QuerySet`` (without
any results loaded) using some code like this:
.. code-block:: pycon
>>> import pickle
>>> query = pickle.loads(s) # Assuming 's' is the pickled string.
>>> qs = MyModel.objects.all()
>>> qs.query = query # Restore the original 'query'.
The ``query`` attribute is an opaque object. It represents the internals of
the query construction and is not part of the public API. However, it is safe
(and fully supported) to pickle and unpickle the attribute's contents as
described here.
.. admonition:: Restrictions on ``QuerySet.values_list()``
If you recreate :meth:`QuerySet.values_list` using the pickled ``query``
attribute, it will be converted to :meth:`QuerySet.values`:
.. code-block:: pycon
>>> import pickle
>>> qs = Blog.objects.values_list("id", "name")
>>> qs
<QuerySet [(1, 'Beatles Blog')]>
>>> reloaded_qs = Blog.objects.all()
>>> reloaded_qs.query = pickle.loads(pickle.dumps(qs.query))
>>> reloaded_qs
<QuerySet [{'id': 1, 'name': 'Beatles Blog'}]>
.. admonition:: You can't share pickles between versions
Pickles of ``QuerySets`` are only valid for the version of Django that
was used to generate them. If you generate a pickle using Django
version N, there is no guarantee that pickle will be readable with
Django version N+1. Pickles should not be used as part of a long-term
archival strategy.
Since pickle compatibility errors can be difficult to diagnose, such as
silently corrupted objects, a ``RuntimeWarning`` is raised when you try to
unpickle a queryset in a Django version that is different than the one in
which it was pickled.
.. _queryset-api:
``QuerySet`` API
================
Here's the formal declaration of a ``QuerySet``:
.. class:: QuerySet(model=None, query=None, using=None, hints=None)
Usually when you'll interact with a ``QuerySet`` you'll use it by
:ref:`chaining filters <chaining-filters>`. To make this work, most
``QuerySet`` methods return new querysets. These methods are covered in
detail later in this section.
The ``QuerySet`` class has the following public attributes you can use for
introspection:
.. attribute:: ordered
``True`` if the ``QuerySet`` is ordered — i.e. has an
:meth:`order_by()` clause or a default ordering on the model.
``False`` otherwise.
.. attribute:: db
The database that will be used if this query is executed now.
.. note::
The ``query`` parameter to :class:`QuerySet` exists so that specialized
query subclasses can reconstruct internal query state. The value of the
parameter is an opaque representation of that query state and is not
part of a public API.
.. currentmodule:: django.db.models.query.QuerySet
Methods that return new ``QuerySet``\s
--------------------------------------
Django provides a range of ``QuerySet`` refinement methods that modify either
the types of results returned by the ``QuerySet`` or the way its SQL query is
executed.
.. note::
These methods do not run database queries, therefore they are **safe to**
**run in asynchronous code**, and do not have separate asynchronous
versions.
``filter()``
~~~~~~~~~~~~
.. method:: filter(*args, **kwargs)
没有合适的资源?快使用搜索试试~ 我知道了~
django的中文文档,不翻墙也可以使用的离线文档
共1245个文件
html:601个
txt:587个
png:29个
需积分: 0 0 下载量 26 浏览量
2024-06-22
15:11:03
上传
评论
收藏 6.71MB RAR 举报
温馨提示
Django是一款流行的Python Web框架,它提供了丰富的功能和灵活性,让开发者可以快速构建高效的Web应用程序。以下是关于Django中文文档的离线版内容概要、适用人群、适用场景及目标: 内容概要 Django中文文档的离线版主要包含以下几个部分: 教程:介绍如何使用Django框架创建一个简单的Web应用程序。 模型:详细说明Django的模型层,包括数据库模型定义、查询和操作等内容。 视图:介绍视图函数和类视图的使用方法,以及处理请求和生成响应的过程。 模板:指导开发者如何创建和使用Django模板,实现数据展示和页面渲染。 表单:解释Django表单的创建、验证和处理方式,以及常见表单组件的使用方法。 管理后台:介绍Django自带的管理后台功能,方便管理和操作数据库数据。 安全和认证:讨论Django中的用户认证和授权机制,以及常见的安全问题和防护措施。 部署和扩展:指导开发者如何将Django应用程序部署到生产环境,并介绍扩展Django的方法。 适用人群 Django中文文档的离线版适用于以下人群: Django初学者:希望学习Django框架的基础知识和使用
资源推荐
资源详情
资源评论
收起资源包目录
django的中文文档,不翻墙也可以使用的离线文档 (1245个子文件)
.buildinfo 230B
basic.css 14KB
djangodocs.css 7KB
reset-fonts-grids.css 5KB
pygments.css 5KB
homepage.css 892B
console-tabs.css 875B
fa-brands.min.css 630B
default.css 92B
fa-brands-400.eot 95KB
genindex.html 608KB
querysets.html 496KB
index.html 430KB
settings.html 378KB
fields.html 310KB
builtins.html 295KB
database-functions.html 293KB
tools.html 257KB
queries.html 238KB
gdal.html 231KB
translation.html 229KB
1.7.html 228KB
1.8.html 226KB
django-admin.html 220KB
api.html 215KB
fields.html 207KB
default.html 203KB
flattened-index.html 187KB
request-response.html 178KB
1.9.html 170KB
models.html 170KB
geos.html 166KB
1.10.html 165KB
expressions.html 164KB
modelforms.html 163KB
security.html 158KB
1.6.html 147KB
1.4.html 147KB
cache.html 145KB
utils.html 141KB
customizing.html 139KB
widgets.html 137KB
formsets.html 137KB
fields.html 133KB
checks.html 132KB
api.html 128KB
deprecation.html 121KB
custom-template-tags.html 121KB
instances.html 120KB
1.11.html 119KB
1.2.html 119KB
contents.html 109KB
databases.html 108KB
3.1.html 107KB
syndication.html 103KB
3.2.html 102KB
geoquerysets.html 102KB
2.0.html 101KB
advanced.html 101KB
auth.html 101KB
5.0.html 96KB
1.5.html 95KB
4.0.html 95KB
tutorial.html 94KB
4.1.html 94KB
sessions.html 94KB
mixins.html 93KB
index.html 93KB
1.0-porting-guide.html 91KB
custom-model-fields.html 89KB
urls.html 88KB
generic-date-based.html 87KB
migrations.html 86KB
1.3.html 86KB
3.0.html 86KB
functions.html 85KB
contenttypes.html 84KB
email.html 83KB
multi-db.html 82KB
migration-operations.html 78KB
aggregation.html 78KB
tutorial02.html 77KB
tutorial05.html 77KB
4.2.html 76KB
passwords.html 75KB
staticfiles.html 73KB
sitemaps.html 73KB
language.html 70KB
serialization.html 70KB
transactions.html 70KB
2.2.html 69KB
timezones.html 69KB
db-api.html 69KB
templates.html 68KB
signals.html 68KB
options.html 65KB
validators.html 64KB
unit-tests.html 63KB
sync.html 63KB
aggregates.html 63KB
共 1245 条
- 1
- 2
- 3
- 4
- 5
- 6
- 13
资源评论
#不吃香菜
- 粉丝: 440
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功