{"title":"QuerySet API 参考","version":"4.2","locale":"zh-hans","docname":"ref/models/querysets","url":"/zh-hans/4.2/ref/models/querysets/","canonical":"https://djangodocs.dev/zh-hans/4.2/ref/models/querysets/","summary":"该文档描述了 QuerySet API 的细节。它是建立在 模型 和 数据库查询 指南的材料基础上的，因此，在阅读这篇文档之前，你可能需要阅读和理解这些文档。 在整个参考资料中，我们将使用在 数据库查询指南 中提出的 示例博客模型 。 什么时候 QuerySet 被执行 Link to this heading #…","html":"<h1><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> API 参考<a class=\"heading-anchor\" href=\"#queryset-api-reference\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>该文档描述了 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> API 的细节。它是建立在 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/models/\"><span class=\"doc\">模型</span></a> 和 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/queries/\"><span class=\"doc\">数据库查询</span></a> 指南的材料基础上的，因此，在阅读这篇文档之前，你可能需要阅读和理解这些文档。</p>\n<p>在整个参考资料中，我们将使用在 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/queries/\"><span class=\"doc\">数据库查询指南</span></a> 中提出的  <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/queries/#queryset-model-example\"><span class=\"std std-ref\">示例博客模型</span></a>。</p>\n<section id=\"when-querysets-are-evaluated\">\n<span id=\"id1\"></span><h2>什么时候 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 被执行<a class=\"heading-anchor\" href=\"#when-querysets-are-evaluated\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 本身可以被构造，过滤，切片，或者复制赋值等，是无需访问数据库的。只有在你需要从数据库取出数据或者，向数据库存入数据时才需要访问数据库。</p>\n<p>你可以用以下方式执行一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>：</p>\n<ul>\n<li><p><strong>迭代。</strong> 一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 是可迭代的，当你第一次迭代它时，它就会执行其数据库查询。例如，这将打印数据库中所有条目的标题：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">():</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">headline</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>注意：如果你想做的只是确定至少一个结果是否存在，不要使用这个。使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exists\" title=\"django.db.models.query.QuerySet.exists\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exists()</span></code></a> 会更有效。</p>\n</li>\n<li><p><strong>异步迭代</strong>。可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">async</span> <span class=\"pre\">for</span></code> 来迭代一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">async</span> <span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">():</span>\n    <span class=\"n\">results</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>QuerySets 的同步和异步迭代器共享相同的底层缓存。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>已添加对异步迭代的支持。</p>\n</aside>\n</li>\n<li><p><strong>切片。</strong> 正如在 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/queries/#limiting-querysets\"><span class=\"std std-ref\">限制 QuerySet 条目数</span></a> 中所解释的那样，<code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 可以使用 Python 的数组切片语法进行切片。切片一个未执行的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 通常会返回另一个未执行的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，但如果使用切片语法的 <code class=\"docutils literal notranslate\"><span class=\"pre\">step</span></code> 参数，Django 会执行数据库查询，并返回一个列表。切片一个已经执行过的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 也会返回一个列表。</p>\n<p>还要注意的是，即使对一个未执行的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 进行切片，返回另一个未执行的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，也不允许进一步修改它（例如，添加更多的过滤器，或修改排序），因为这不能很好地翻译成 SQL，也没有明确的含义。</p>\n</li>\n<li><p><strong>Pickle 序列化／缓存。</strong> 关于 <a class=\"reference internal\" href=\"#pickling-querysets\">pickling QuerySets</a> 时涉及的细节，请参见下一节。就本节而言，重要的是，结果是从数据库中读取的。</p></li>\n<li><p><strong>repr()。</strong> 当你调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">repr()</span></code> 时，所在 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 会被执行。这是为了方便 Python 交互式解释器，所以当你交互式使用 API 时，可以立即看到你的结果。</p></li>\n<li><p><strong>len()。</strong> 当你调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">len()</span></code> 时，会执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>。正如你所期望的，这将返回结果列表的长度。</p>\n<p>注意：如果你只需要确定集合中的记录数（而不需要实际的对象），那么使用 SQL 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">COUNT(*)</span></code> 在数据库层面上处理计数会更有效率。Django 提供了一个 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.count\" title=\"django.db.models.query.QuerySet.count\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">count()</span></code></a> 方法正是为了这个原因。</p>\n</li>\n<li><p><strong>list()。</strong> 通过调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">list()</span></code> 强制执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">entry_list</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">())</span>\n</code></pre></div>\n</li>\n<li><p><strong>bool()。</strong> 在布尔语境中测试 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，如使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">bool()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">or</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">and</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span></code> 语句，将导致查询被执行。如果至少有一个结果，则 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，否则为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;Test&quot;</span><span class=\"p\">):</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;There is at least one Entry with the headline Test&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>注意：如果你只想确定至少一个结果是否存在（而不需要实际的对象），使用 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exences()</span></code> 更高效。</p>\n</li>\n</ul>\n<section id=\"pickling-querysets\">\n<span id=\"id2\"></span><h3>Pickle 序列化 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#pickling-querysets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果你 <a class=\"reference external\" href=\"https://docs.python.org/3/library/pickle.html#module-pickle\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">pickle</span></code></a> 序列化一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，这将迫使所有结果在 pickle 序列化之前加载到内存中。Pickle 序列化通常被用作缓存的前奏，当缓存的查询集被重新加载时，你希望结果已经存在并可以使用（从数据库读取可能需要一些时间，这就违背了缓存的目的）。这意味着，当你取消缓存一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 时，它包含的是它被缓存时的结果，而不是当前在数据库中的结果。</p>\n<p>如果你只想要将必要的信息存储为 pickle，在以后的时间从数据库中重新创建 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，可以 pickle <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">query</span></code> 属性。然后，可以使用类似以下的代码重新创建原始的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> （不加载任何结果）：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">pickle</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">query</span> <span class=\"o\">=</span> <span class=\"n\">pickle</span><span class=\"o\">.</span><span class=\"n\">loads</span><span class=\"p\">(</span><span class=\"n\">s</span><span class=\"p\">)</span>  <span class=\"c1\"># Assuming &#39;s&#39; is the pickled string.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span> <span class=\"o\">=</span> <span class=\"n\">MyModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">query</span> <span class=\"o\">=</span> <span class=\"n\">query</span>  <span class=\"c1\"># Restore the original &#39;query&#39;.</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">query</span></code> 属性是一个不透明的对象。它代表了查询结构的内部结构，不是公共 API 的一部分。但是，如这里所述，可以安全地（并完全支持）pickle 序列化和反序列化该属性的内容。</p>\n<aside class=\"admonition-restrictions-on-queryset-values-list admonition\">\n<p class=\"admonition-title\">对 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.values_list()</span></code> 的限制</p>\n<p>如果使用 pickle 重新创建 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values_list\" title=\"django.db.models.query.QuerySet.values_list\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.values_list()</span></code></a>，它将被转换为 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.values()</span></code></a>：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">pickle</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span>\n<span class=\"go\">&lt;QuerySet [(1, &#39;Beatles Blog&#39;)]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reloaded_qs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reloaded_qs</span><span class=\"o\">.</span><span class=\"n\">query</span> <span class=\"o\">=</span> <span class=\"n\">pickle</span><span class=\"o\">.</span><span class=\"n\">loads</span><span class=\"p\">(</span><span class=\"n\">pickle</span><span class=\"o\">.</span><span class=\"n\">dumps</span><span class=\"p\">(</span><span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">query</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reloaded_qs</span>\n<span class=\"go\">&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;Beatles Blog&#39;}]&gt;</span>\n</code></pre></div>\n</aside>\n<aside class=\"admonition-you-can-t-share-pickles-between-versions admonition\">\n<p class=\"admonition-title\">你不能在不同版本之间共享 pickle</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySets</span></code> 的 pickle 只对生成它们的 Django 版本有效。如果你用 Django N 版本生成了一个 pickle，就不能保证这个 pickle 在 Django N+1 版本中可以被读取。Pickle 不应该作为长期存档策略的一部分。</p>\n<p>由于 pickle 兼容性错误可能很难诊断，比如静默损坏对象，所以当你试图在与序列化 pickle 时不同版本的 Django 中反序列化查询集时，会发出 <code class=\"docutils literal notranslate\"><span class=\"pre\">RuntimeWarning</span></code>。</p>\n</aside>\n</section>\n</section>\n<section id=\"queryset-api\">\n<span id=\"id3\"></span><h2><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> API<a class=\"heading-anchor\" href=\"#queryset-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>这里是 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的正式声明：</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">QuerySet</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">query</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">hints</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>通常当你与 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 交互时，你会通过 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/queries/#chaining-filters\"><span class=\"std std-ref\">链式过滤器</span></a> 来使用它。为了实现这一目的，大多数 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 方法都会返回新的查询集。这些方法将在本节后面详细介绍。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 类具有以下公共属性，可以用于自省：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.ordered\">\n<span class=\"sig-name descname\"><span class=\"pre\">ordered</span></span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.ordered\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 是有序的——即有一个 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> 子句或模型上的默认排序。否则为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.db\">\n<span class=\"sig-name descname\"><span class=\"pre\">db</span></span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.db\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果现在执行这个查询，将使用的数据库。</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">query</span></code> 参数的存在是为了让专门的查询子类能够重建内部查询状态。该参数的值是该查询状态的不透明表示，不是公共 API 的一部分。</p>\n</aside>\n</dd></dl>\n\n<section id=\"methods-that-return-new-querysets\">\n<h3>返回新 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的方法<a class=\"heading-anchor\" href=\"#methods-that-return-new-querysets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django 提供了一系列的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 细化方法，这些方法可以修改 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 返回的结果类型或其 SQL 查询的执行方式。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>这些方法不运行数据库查询，因此它们 <strong>可以安全地在异步代码中运行</strong>，而且没有单独的异步版本。</p>\n</aside>\n<section id=\"filter\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code><a class=\"heading-anchor\" href=\"#filter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.filter\">\n<span class=\"sig-name descname\"><span class=\"pre\">filter</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.filter\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回一个新的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，其中包含与给定查找参数相匹配的对象。</p>\n<p>查询参数（<code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code>）的格式应在下文 <a class=\"reference internal\" href=\"#id4\">Field lookups</a> 中描述。多个参数通过底层 SQL 语句中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">AND</span></code> 连接。</p>\n<p>如果你需要执行更复杂的查询（例如，带有 <code class=\"docutils literal notranslate\"><span class=\"pre\">OR</span></code> 语句的查询），你可以使用 <a class=\"reference internal\" href=\"#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Q</span> <span class=\"pre\">对象</span></code></a> （<code class=\"docutils literal notranslate\"><span class=\"pre\">*args</span></code>）。</p>\n</section>\n<section id=\"exclude\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">exclude()</span></code><a class=\"heading-anchor\" href=\"#exclude\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.exclude\">\n<span class=\"sig-name descname\"><span class=\"pre\">exclude</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.exclude\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回一个新的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，其中包含与给定查找参数不匹配的对象。</p>\n<p>查询参数（<code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code>）的格式应在下文 <a class=\"reference internal\" href=\"#id4\">Field lookups</a> 中描述。多个参数通过底层 SQL 语句中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">AND</span></code> 连接，整个过程用 <code class=\"docutils literal notranslate\"><span class=\"pre\">NOT()</span></code> 括起来。</p>\n<p>这个例子排除了所有 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 晚于 2005-1-3 且 <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> 为“Hello”的条目：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">exclude</span><span class=\"p\">(</span><span class=\"n\">pub_date__gt</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">),</span> <span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>用 SQL 术语来说，它的值是：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span>\n<span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-1-3&#39;</span><span class=\"w\"> </span><span class=\"k\">AND</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;Hello&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这个例子不包括所有 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 晚于 2005-1-3 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> 为“Hello”的条目：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">exclude</span><span class=\"p\">(</span><span class=\"n\">pub_date__gt</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">exclude</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;Hello&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>用 SQL 术语来说，它的值是：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span>\n<span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-1-3&#39;</span>\n<span class=\"k\">AND</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;Hello&#39;</span>\n</code></pre></div>\n<p>请注意，第二个例子的限制性更强。</p>\n<p>如果你需要执行更复杂的查询（例如，带有 <code class=\"docutils literal notranslate\"><span class=\"pre\">OR</span></code> 语句的查询），你可以使用 <a class=\"reference internal\" href=\"#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Q</span> <span class=\"pre\">对象</span></code></a> （<code class=\"docutils literal notranslate\"><span class=\"pre\">*args</span></code>）。</p>\n</section>\n<section id=\"annotate\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code><a class=\"heading-anchor\" href=\"#annotate\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.annotate\">\n<span class=\"sig-name descname\"><span class=\"pre\">annotate</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.annotate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>用所提供的 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/expressions/\"><span class=\"doc\">查询表达式</span></a> 列表对 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中的每个对象进行注解。表达式可以是一个简单的值，也可以是对模型（或任何相关模型）字段的引用，或者是对与 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中的对象相关的对象进行计算的聚合表达式（平均数、总和等）。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">annotate()</span></code> 的每个参数都是一个注解，将被添加到返回的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中的每个对象。</p>\n<p>Django 提供的聚合函数在下面的 <a class=\"reference internal\" href=\"#id6\">聚合函数</a> 中介绍。</p>\n<p>使用关键字参数指定的注解将使用关键字作为注解的别名。匿名参数将根据聚合函数的名称和被聚合的模型字段为其生成一个别名。只有引用单个字段的聚合表达式才能成为匿名参数。其他一切都必须是关键字参数。</p>\n<p>例如，如果你正在操作一个博客列表，你可能想确定每个博客中有多少条条目：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\"># The name of the first blog</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">name</span>\n<span class=\"go\">&#39;Blogasaurus&#39;</span>\n<span class=\"go\"># The number of entries on the first blog</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">entry__count</span>\n<span class=\"go\">42</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code> 模型本身没有定义 <code class=\"docutils literal notranslate\"><span class=\"pre\">entry__count</span></code> 属性，但通过使用关键字参数来指定聚合函数，你可以控制注释的名称：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">number_of_entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\"># The number of entries on the first blog, using the name provided</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">number_of_entries</span>\n<span class=\"go\">42</span>\n</code></pre></div>\n<p>关于聚合的深入讨论，见 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/aggregation/\"><span class=\"doc\">关于聚合的专题指南</span></a>。</p>\n</section>\n<section id=\"alias\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">alias()</span></code><a class=\"heading-anchor\" href=\"#alias\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.alias\">\n<span class=\"sig-name descname\"><span class=\"pre\">alias</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.alias\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>与 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a> 相同，但不是注解中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 对象，而是保存表达式，以便以后与其他 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 方法重复使用。当不需要表达式本身的结果，但用于过滤、排序或作为复杂表达式的一部分时，这很有用。不查找未使用的值可以从数据库中移除多余的工作，这应该会带来更好的性能。</p>\n<p>例如，如果你想查找具有超过 5 条条目的博客，但不关心具体的条目数量，你可以这样做：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">blogs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">alias</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">entries__gt</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">alias()</span></code> 可以与 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a>、<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exclude()</span></code></a>、<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">filter()</span></code></a>、<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> 和 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.update\" title=\"django.db.models.query.QuerySet.update\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">update()</span></code></a> 一起使用。要将别名表达式与其他方法（例如 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.aggregate\" title=\"django.db.models.query.QuerySet.aggregate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code></a>）一起使用，你必须将其提升为注解：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">alias</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n    <span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;entries&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Sum</span><span class=\"p\">(</span><span class=\"s2\">&quot;entries&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">filter()</span></code></a> 和 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> 可以直接接受表达式，但表达式的构建和使用往往不发生在同一个地方（例如，<code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 方法创建表达式，以便以后在视图中使用）。<code class=\"docutils literal notranslate\"><span class=\"pre\">alias()</span></code> 允许逐步建立复杂的表达式，可能跨越多个方法和模块，用它们的别名指代表达式部分，只用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a> 来获得最终结果。</p>\n</section>\n<section id=\"order-by\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code><a class=\"heading-anchor\" href=\"#order-by\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.order_by\">\n<span class=\"sig-name descname\"><span class=\"pre\">order_by</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.order_by\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>默认情况下，<code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 返回的结果是按照模型 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> 中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">ordering</span></code> 选项给出的排序元组排序的。你可以通过使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by</span></code> 方法在每个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的基础上覆盖这一点。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;-pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>上述结果将按 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 降序排列，然后按 <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> 升序排列。<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;-pub_date&quot;</span></code> 前面的负号表示 <em>降序</em>。升序是隐含的。要随机排序，使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;?&quot;</span></code>，如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;?&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>注意：<code class=\"docutils literal notranslate\"><span class=\"pre\">order_by('?')</span></code> 查询可能会很贵，而且速度很慢，这取决于你使用的数据库后端。</p>\n<p>要按不同模型中的字段排序，使用与跨模型关系查询时相同的语法。也就是说，字段的名称，后面是双下划线（<code class=\"docutils literal notranslate\"><span class=\"pre\">__</span></code>），再后面是新模型中的字段名称，以此类推，想加入多少模型就加入多少。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog__name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你试图通过与另一个模型有关系的字段进行排序，Django 将使用相关模型上的默认排序，如果没有指定 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.ordering</span></code></a>，则通过相关模型的主键进行排序。例如，由于 <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code> 模型没有指定默认排序：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>...等同于：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog__id&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code> 有 <code class=\"docutils literal notranslate\"><span class=\"pre\">ordering</span> <span class=\"pre\">=</span> <span class=\"pre\">['name']</span></code>，那么第一个查询集将与以下内容相同：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog__name&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>你也可以通过在表达式上调用 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/expressions/#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">asc()</span></code></a> 或 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">esc()</span></code>，按 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/expressions/\"><span class=\"doc\">查询表达式</span></a> 排序：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"n\">Coalesce</span><span class=\"p\">(</span><span class=\"s2\">&quot;summary&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">desc</span><span class=\"p\">())</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/expressions/#django.db.models.Expression.asc\" title=\"django.db.models.Expression.asc\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">asc()</span></code></a> 和 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">esc()</span></code> 有参数（<code class=\"docutils literal notranslate\"><span class=\"pre\">nulls_first</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">nulls_last</span></code>）来控制如何对空值进行排序。</p>\n<p>如果你还使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">distinct()</span></code></a>，在按相关模型中的字段排序时要谨慎。请参见 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">distinct()</span></code></a> 中的说明，解释相关模型排序如何改变预期结果。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>允许指定一个多值字段来对结果进行排序（例如，一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> 字段，或者一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 字段的反向关系）。</p>\n<p>考虑到这种情况：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Event</span><span class=\"p\">(</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">parent</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;self&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n        <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;children&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n\n\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;children__date&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>在这里，每个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Event</span></code> 可能有多个排序数据；每个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Event</span></code> 有多个 <code class=\"docutils literal notranslate\"><span class=\"pre\">children</span></code> 将被多次返回到 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> 创建的新 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中。换句话说，在 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 上使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> 可能会返回比你一开始工作更多的项目——这可能既不是预期的，也不是有用的。</p>\n<p>因此，在使用多值字段对结果进行排序时要注意。<strong>如果</strong> 你能确定你要订购的每个项目只有一个订购数据，这种方法应该不会出现问题。如果不是，请确保结果是你所期望的。</p>\n</aside>\n<p>没有办法指定排序是否应该区分大小写。关于大小写敏感，Django 会按照数据库后台的正常排序方式来排序。</p>\n<p>你可以用 <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Lower</span></code> 将一个字段转换为小写，从而实现大小写一致的排序：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"n\">Lower</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">desc</span><span class=\"p\">())</span>\n</code></pre></div>\n<p>如果你不想在查询中应用任何排序，甚至是默认的排序，可以不使用参数调用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a>。</p>\n<p>你可以通过检查 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.ordered\" title=\"django.db.models.query.QuerySet.ordered\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">QuerySet.ordered</span></code></a> 属性来判断一个查询是否被排序，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 以任何方式被排序，则该属性为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>。</p>\n<p>每次 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> 调用都将清除以前的任何排序。例如，此查询将按 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 而不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> 排序：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>排序不是一个免费的操作。你添加到排序中的每个字段都会给你的数据库带来成本。你添加的每个外键都会隐式地包含其所有的默认排序。</p>\n<p>如果查询没有指定顺序，那么结果将以未指定的顺序从数据库中返回。只有当按一组字段排序时，才能保证特定的排序，这些字段唯一地标识结果中的每个对象。例如，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> 字段不是唯一的，那么按它排序就不能保证具有相同名称的对象总是以相同的顺序出现。</p>\n</aside>\n</section>\n<section id=\"reverse\">\n<h4>reverse()<a class=\"heading-anchor\" href=\"#reverse\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.reverse\">\n<span class=\"sig-name descname\"><span class=\"pre\">reverse</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.reverse\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse()</span></code> 方法来反向返回查询集元素的顺序。第二次调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse()</span></code> 会将顺序恢复到正常方向。</p>\n<p>要检索一个查询集中的“最后”五个项目，你可以这样做：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">my_queryset</span><span class=\"o\">.</span><span class=\"n\">reverse</span><span class=\"p\">()[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>请注意，这与 Python 中从一个序列的末尾切分不太一样。上面的例子会先返回最后一项，然后返回倒数第二项，以此类推。如果我们有一个 Python 序列，看 <code class=\"docutils literal notranslate\"><span class=\"pre\">seq[-5:]</span></code>，我们会先看到倒数第五项。Django 不支持这种访问模式（从末尾切分），因为在 SQL 中不可能有效地做到这一点。</p>\n<p>另外，请注意，<code class=\"docutils literal notranslate\"><span class=\"pre\">reverse()</span></code> 一般只应在有定义顺序的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 上调用（例如，当对定义了默认顺序的模型进行查询时，或者当使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> 时）。如果没有为一个给定的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 定义这样的排序，对它调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse()</span></code> 没有实际效果（在调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse()</span></code> 之前，排序是未定义的，之后也将保持未定义）。</p>\n</section>\n<section id=\"distinct\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code><a class=\"heading-anchor\" href=\"#distinct\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.distinct\">\n<span class=\"sig-name descname\"><span class=\"pre\">distinct</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.distinct\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回一个新的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，在其 SQL 查询中使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">DISTINCT</span></code>。这将消除查询结果中的重复记录。</p>\n<p>默认情况下，<code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 不会消除重复的记录。在实践中，这很少是一个问题，因为简单的查询，如 <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog.objects.all()</span></code> 不会引入重复结果行的可能性。但是，如果你的查询跨越了多个表，当 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 被执行时，就有可能得到重复的结果。这时就应该使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code>。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> 调用中使用的任何字段都包含在 SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> 列中。当与 <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code> 结合使用时，这有时会导致意外的结果。如果按相关模型中的字段排序，这些字段将被添加到选定的列中，它们可能会使原本重复的行看起来是不同的。由于额外的列不会出现在返回的结果中（它们只是为了支持排序），所以有时看起来像是返回了非去重的结果。</p>\n<p>同样，如果使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a> 查询来限制所选的列，任何 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> 中使用的列（或默认的模型排序）仍然会被涉及，并可能影响结果的唯一性。</p>\n<p>这里的寓意是，如果你使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code>，要小心按相关模型排序。同样，当同时使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code> 和 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a> 时，在按 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a> 调用中没有的字段排序时要小心。</p>\n</aside>\n<p>仅在 PostgreSQL 上，你可以传递位置参数（<code class=\"docutils literal notranslate\"><span class=\"pre\">*fields</span></code>），以指定 <code class=\"docutils literal notranslate\"><span class=\"pre\">DISTINCT</span></code> 应适用的字段名称。这相当于一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">DISTINCT</span> <span class=\"pre\">ON</span></code> 的 SQL 查询。这其中的区别是，对于普通的 <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code> 调用，数据库在确定哪些行是不同的时候，会比较每行中的 <em>每个</em> 字段。对于带有指定字段名的 <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code> 调用，数据库将只比较指定的字段名。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>当你指定字段名时，你 <em>必须</em> 在 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中提供一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code>，而且 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> 中的字段必须以 <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code> 中的字段开始，顺序相同。</p>\n<p>例如，<code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">DISTINCT</span> <span class=\"pre\">ON</span> <span class=\"pre\">(a)</span></code> 给出了列 <code class=\"docutils literal notranslate\"><span class=\"pre\">a</span></code> 中每个值的第一行。如果你不指定顺序，你会得到一些任意的行。</p>\n</aside>\n<p>示例（在第一个示例之后，只能在 PostgreSQL 上运行）：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">()</span>\n<span class=\"go\">[...]</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[...]</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[...]</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[...]</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog__name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;mod_date&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog__name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;mod_date&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[...]</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[...]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>请记住 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> 使用任何已经定义的默认相关模型排序。你可能必须明确地按关系 <code class=\"docutils literal notranslate\"><span class=\"pre\">_id</span></code> 或引用字段排序，以确保 <code class=\"docutils literal notranslate\"><span class=\"pre\">DISTINCT</span> <span class=\"pre\">ON</span></code> 表达式与 <code class=\"docutils literal notranslate\"><span class=\"pre\">ORDER</span> <span class=\"pre\">BY</span></code> 子句开头的表达式匹配。例如，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code> 模型定义了一个通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> 进行 <code class=\"xref py py-attr docutils literal notranslate\"> <span class=\"pre\">ordering</span></code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>...这是不可行的，因为查询将按 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog__name</span></code> 排序，从而与 <code class=\"docutils literal notranslate\"><span class=\"pre\">DISTINCT</span> <span class=\"pre\">ON</span></code> 表达式不匹配。你必须明确地按关系 <code class=\"docutils literal notranslate\"><span class=\"pre\">_id</span></code> 字段（本例中为 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog_id</span></code>）或被引用的字段（<code class=\"docutils literal notranslate\"><span class=\"pre\">blog__pk</span></code>）排序，以确保两个表达式匹配。</p>\n</aside>\n</section>\n<section id=\"values\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code><a class=\"heading-anchor\" href=\"#values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.values\">\n<span class=\"sig-name descname\"><span class=\"pre\">values</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">fields</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">expressions</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.values\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，当用作可迭代对象时，返回字典，而不是模型实例。</p>\n<p>其中每一个字典都代表一个对象，键与模型对象的属性名相对应。</p>\n<p>这个示例比较了 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 的字典与普通的模型对象：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"go\"># This list contains a Blog object.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;Beatles&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Blog: Beatles Blog&gt;]&gt;</span>\n\n<span class=\"go\"># This list contains a dictionary.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;Beatles&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;Beatles Blog&#39;, &#39;tagline&#39;: &#39;All the latest Beatles news.&#39;}]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 方法接受可选的位置参数 <code class=\"docutils literal notranslate\"><span class=\"pre\">*fields</span></code>，它指定了 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> 应该被限制的字段名。如果你指定了字段，每个字典将只包含你指定字段的字段键／值。如果不指定字段，每个字典将包含数据库表中每个字段的键和值。</p>\n<p>例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;Beatles Blog&#39;, &#39;tagline&#39;: &#39;All the latest Beatles news.&#39;}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;Beatles Blog&#39;}]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 方法还接受可选的关键字参数 <code class=\"docutils literal notranslate\"><span class=\"pre\">**expressions</span></code>，这些参数将传递给 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a>：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.functions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Lower</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"n\">lower_name</span><span class=\"o\">=</span><span class=\"n\">Lower</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;lower_name&#39;: &#39;beatles blog&#39;}]&gt;</span>\n</code></pre></div>\n<p>你可以在排序中使用内置和 <a class=\"reference internal\" href=\"/zh-hans/4.2/howto/custom-lookups/\"><span class=\"doc\">自定义查找</span></a>。例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CharField</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.functions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Lower</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">CharField</span><span class=\"o\">.</span><span class=\"n\">register_lookup</span><span class=\"p\">(</span><span class=\"n\">Lower</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;name__lower&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;name__lower&#39;: &#39;beatles blog&#39;}]&gt;</span>\n</code></pre></div>\n<p>在 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 子句内部的聚合在同一 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 子句内的其他参数之前应用。如果需要按另一个值进行分组，请将其添加到较早的 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 子句中。例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors&quot;</span><span class=\"p\">,</span> <span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors&#39;: 1, &#39;entries&#39;: 20}, {&#39;entry__authors&#39;: 1, &#39;entries&#39;: 13}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors&#39;: 1, &#39;entries&#39;: 33}]&gt;</span>\n</code></pre></div>\n<p>有几个微妙的地方值得一提：</p>\n<ul>\n<li><p>如果你有一个名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> 的字段是一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>，默认的 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 调用将返回一个名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">foo_id</span></code> 的字典键，因为这是存储实际值的隐藏模型属性的名称（<code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> 属性指的是相关模型）。当你调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 并传递字段名时，你可以传递 <code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">foo_id</span></code>，你将得到同样的东西（字典键将与你传递的字段名匹配）。</p>\n<p>例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [{&#39;blog_id&#39;: 1, &#39;headline&#39;: &#39;First Entry&#39;, ...}, ...]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;blog&#39;: 1}, ...]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog_id&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;blog_id&#39;: 1}, ...]&gt;</span>\n</code></pre></div>\n</li>\n<li><p>当使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 与 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">distinct()</span></code></a> 一起使用时，请注意排序会影响结果。详见 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">distinct()</span></code></a> 中的说明。</p></li>\n<li><p>如果在 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">extra()</span></code></a> 调用之后使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 子句，则 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">extra()</span></code></a> 中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code> 参数所定义的任何字段必须明确地包含在 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 调用中。任何在 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 调用之后进行的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">extra()</span></code></a> 调用将忽略其额外选择的字段。</p></li>\n<li><p>在 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 之后调用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">only()</span></code></a> 和 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">defer()</span></code></a> 是没有意义的，这样做会引发 <code class=\"docutils literal notranslate\"><span class=\"pre\">TypeError</span></code>。</p></li>\n<li><p>组合转换和聚合需要使用两个 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a> 调用，可以显式地使用它们，也可以作为 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a> 的关键字参数。与上面一样，如果转换已经在相关字段类型上注册，第一个 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a> 可以省略，因此以下示例是等效的：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CharField</span><span class=\"p\">,</span> <span class=\"n\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.functions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Lower</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">CharField</span><span class=\"o\">.</span><span class=\"n\">register_lookup</span><span class=\"p\">(</span><span class=\"n\">Lower</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors__name__lower&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors__name__lower&#39;: &#39;test author&#39;, &#39;entries&#39;: 33}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"n\">entry__authors__name__lower</span><span class=\"o\">=</span><span class=\"n\">Lower</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors__name&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors__name__lower&#39;: &#39;test author&#39;, &#39;entries&#39;: 33}]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">entry__authors__name__lower</span><span class=\"o\">=</span><span class=\"n\">Lower</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry__authors__name&quot;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;entry__authors__name__lower&quot;</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [{&#39;entry__authors__name__lower&#39;: &#39;test author&#39;, &#39;entries&#39;: 33}]&gt;</span>\n</code></pre></div>\n</li>\n</ul>\n<p>当你知道你只需要一小部分可用字段的值，而且你不需要模型实例对象的功能时，它就很有用。只选择你需要使用的字段会更高效。</p>\n<p>最后要注意的是，你可以在调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 之后调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> 等，也就是说这两个调用是相同的：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>制作 Django 的人喜欢把所有影响 SQL 的方法放在前面，后面（可选的）是任何影响输出的方法（比如 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code>），但这并不重要。这是你真正炫耀自己个性的机会。</p>\n<p>你还可以通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code> 属性引用反向关系上的相关模型的字段：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;entry__headline&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [{&#39;name&#39;: &#39;My blog&#39;, &#39;entry__headline&#39;: &#39;An entry&#39;},</span>\n<span class=\"go\">     {&#39;name&#39;: &#39;My blog&#39;, &#39;entry__headline&#39;: &#39;Another entry&#39;}, ...]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>因为 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> 属性和逆向关系可以有多条相关的记录，包括这些可以对你的结果集的大小产生倍增效应。如果你在你的 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 查询中包含了多个这样的字段，这一点会特别明显，在这种情况下，所有可能的组合都会被返回。</p>\n</aside>\n<aside class=\"admonition-special-values-for-jsonfield-on-sqlite admonition\">\n<p class=\"admonition-title\">SQLite 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">JSONField</span></code> 具有一些特殊的值</p>\n<p>由于 SQLite 上实现了 <code class=\"docutils literal notranslate\"><span class=\"pre\">JSON_EXTRACT</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">JSON_TYPE</span></code> SQL 函数的方式以及缺少 <code class=\"docutils literal notranslate\"><span class=\"pre\">BOOLEAN</span></code> 数据类型，<code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 将为 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONField</span></code></a> 键转换返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>，而不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;true&quot;</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;false&quot;</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;null&quot;</span></code> 字符串。</p>\n</aside>\n</section>\n<section id=\"values-list\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code><a class=\"heading-anchor\" href=\"#values-list\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.values_list\">\n<span class=\"sig-name descname\"><span class=\"pre\">values_list</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">fields</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">flat</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">named</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.values_list\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>这与 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 类似，不同之处在于在迭代时，它返回元组而不是字典。每个元组包含传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code> 调用的相应字段或表达式的值 — 因此第一个项是第一个字段，依此类推。例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(1, &#39;First entry&#39;), ...]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.functions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Lower</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"n\">Lower</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [(1, &#39;first entry&#39;), ...]&gt;</span>\n</code></pre></div>\n<p>如果只传递一个字段，还可以传递 <code class=\"docutils literal notranslate\"><span class=\"pre\">flat</span></code> 参数。如果为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，则返回的结果将是单个值，而不是一元组。一个示例可以更清楚地说明区别：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet[(1,), (2,), (3,), ...]&gt;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"n\">flat</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [1, 2, 3, ...]&gt;</span>\n</code></pre></div>\n<p>当有多个字段时，传入 <code class=\"docutils literal notranslate\"><span class=\"pre\">flat</span></code> 是错误的。</p>\n<p>你可以传递 <code class=\"docutils literal notranslate\"><span class=\"pre\">named=True</span></code> 以将结果作为 <a class=\"reference external\" href=\"https://docs.python.org/3/library/collections.html#collections.namedtuple\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">namedtuple()</span></code></a> 返回：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"n\">named</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [Row(id=1, headline=&#39;First entry&#39;), ...]&gt;</span>\n</code></pre></div>\n<p>使用命名元组可能会使使用结果更易读，但代价是将结果转化为命名元组时要付出很小的性能代价。</p>\n<p>如果你不向 <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code> 传递任何值，它将按照声明的顺序返回模型中的所有字段。</p>\n<p>一个常见的需求是获取特定模型实例的特定字段值。要实现这一点，使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code> 后跟一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> 调用：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"n\">flat</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;First entry&#39;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code> 都是针对特定用例的优化：检索数据的子集，而不需要创建一个模型实例的开销。当处理多对多和其他多值关系（如反向外键的一对多关系）时，这个隐喻就失效了，因为“一行一对象”的假设不成立。</p>\n<p>例如，请注意在查询跨越 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> 时的行为：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;entry__headline&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Noam Chomsky&#39;, &#39;Impressions of Gaza&#39;),</span>\n<span class=\"go\"> (&#39;George Orwell&#39;, &#39;Why Socialists Do Not Believe in Fun&#39;),</span>\n<span class=\"go\"> (&#39;George Orwell&#39;, &#39;In Defence of English Cooking&#39;),</span>\n<span class=\"go\"> (&#39;Don Quixote&#39;, None)]&gt;</span>\n</code></pre></div>\n<p>有多个条目的作者出现多次，没有任何条目的作者的条目标题为 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>。</p>\n<p>类似地，当查询反向外键时，对于没有任何作者的条目，会显示为 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [(&#39;Noam Chomsky&#39;,), (&#39;George Orwell&#39;,), (None,)]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition-special-values-for-jsonfield-on-sqlite admonition\">\n<p class=\"admonition-title\">SQLite 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">JSONField</span></code> 具有一些特殊的值</p>\n<p>由于 SQLite 上实现了 <code class=\"docutils literal notranslate\"><span class=\"pre\">JSON_EXTRACT</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">JSON_TYPE</span></code> SQL 函数的方式以及缺少 <code class=\"docutils literal notranslate\"><span class=\"pre\">BOOLEAN</span></code> 数据类型，<code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code> 将为 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONField</span></code></a> 键转换返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>，而不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;true&quot;</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;false&quot;</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;null&quot;</span></code> 字符串。</p>\n</aside>\n</section>\n<section id=\"dates\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">dates()</span></code><a class=\"heading-anchor\" href=\"#dates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.dates\">\n<span class=\"sig-name descname\"><span class=\"pre\">dates</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">kind</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">order</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'ASC'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.dates\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，它的值是一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.date\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.date</span></code></a> 对象的列表，代表 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 内容中所有可用的特定日期。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">field</span></code> 应该是你的模型的 <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> 的名称。<code class=\"docutils literal notranslate\"><span class=\"pre\">kind</span></code> 应该是``&quot;year&quot;<code class=\"docutils literal notranslate\"><span class=\"pre\">、</span></code>&quot;month&quot;<code class=\"docutils literal notranslate\"><span class=\"pre\">、</span></code>&quot;week&quot;`` 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;day&quot;</span></code>。结果列表中的每个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.date\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.date</span></code></a> 对象都被“截断”为给定的` type`。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;year&quot;</span></code> 返回字段的所有不同年份值的列表。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;month&quot;</span></code> 返回该字段所有不同年／月值的列表。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;week&quot;</span></code> 返回该字段的所有不同年份／星期值的列表。所有日期都是星期一。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;day&quot;</span></code> 返回该字段的所有不同年／月／日值的列表。</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">order</span></code>，默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">'ASC'</span></code>，应该是 <code class=\"docutils literal notranslate\"><span class=\"pre\">'ASC'</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">'DESC'</span></code>。这指定了如何对结果进行排序。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;year&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 1, 1)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;month&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 2, 1), datetime.date(2005, 3, 1)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;week&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 2, 14), datetime.date(2005, 3, 14)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;day&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 2, 20), datetime.date(2005, 3, 20)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;day&quot;</span><span class=\"p\">,</span> <span class=\"n\">order</span><span class=\"o\">=</span><span class=\"s2\">&quot;DESC&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 3, 20), datetime.date(2005, 2, 20)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__contains</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">dates</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;day&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[datetime.date(2005, 3, 20)]</span>\n</code></pre></div>\n</section>\n<section id=\"datetimes\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">datetimes()</span></code><a class=\"heading-anchor\" href=\"#datetimes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.datetimes\">\n<span class=\"sig-name descname\"><span class=\"pre\">datetimes</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">kind</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">order</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'ASC'</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">tzinfo</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">is_dst</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.datetimes\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，它的值是一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.datetime</span></code></a> 对象的列表，代表 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 内容中所有可用的特定日期。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span></code> 应该是你的模型中 <code class=\"docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code> 的名称。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">kind</span></code> 应该是 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;year&quot;</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;month&quot;</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;week&quot;</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;day&quot;</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;hour&quot;</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;minute&quot;</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;second&quot;</span></code>。结果列表中的每个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.datetime</span></code></a> 对象都被“截断”为给定的 <code class=\"docutils literal notranslate\"><span class=\"pre\">type</span></code>。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">order</span></code>，默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">'ASC'</span></code>，应该是 <code class=\"docutils literal notranslate\"><span class=\"pre\">'ASC'</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">'DESC'</span></code>。这指定了如何对结果进行排序。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">tzinfo</span></code> 定义了在截断之前将日期时间转换为的时区。事实上，一个给定的日期时间根据使用的时区有不同的表示方式。这个参数必须是一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.tzinfo\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.tzinfo</span></code></a> 对象。如果是 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>，Django 会使用 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/i18n/timezones/#default-current-time-zone\"><span class=\"std std-ref\">current time zone</span></a>。当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 时，它没有效果。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">is_dst</span></code> 表示 <code class=\"docutils literal notranslate\"><span class=\"pre\">pytz</span></code> 是否应该解释夏令时中不存在的和含糊不清的日期。默认情况下（当 <code class=\"docutils literal notranslate\"><span class=\"pre\">is_dst=None</span></code>），<code class=\"docutils literal notranslate\"><span class=\"pre\">pytz</span></code> 会对这种日期时间产生异常。</p>\n<aside class=\"version-note version-deprecated\" data-version=\"4.0\">\n<p class=\"version-note-title\">Deprecated since Django 4.0</p><p><span class=\"versionmodified deprecated\">Deprecated since version 4.0: </span><code class=\"docutils literal notranslate\"><span class=\"pre\">is_dst</span></code> 参数已被废弃，将在 Django 5.0 中删除。</p>\n</aside>\n<aside class=\"admonition admonition-note\" id=\"database-time-zone-definitions\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>这个函数直接在数据库中执行时区转换。因此，你的数据库必须能够解释 <code class=\"docutils literal notranslate\"><span class=\"pre\">tzinfo.tzname(None)</span></code> 的值。这就转化为以下要求：</p>\n<ul class=\"simple\">\n<li><p>SQLite：没有要求。转换是在 Python 中进行的。</p></li>\n<li><p>PostgreSQL：无要求（见 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-TIMEZONES\">Time Zones</a> ）。</p></li>\n<li><p>Oracle：无要求（见 <a class=\"reference external\" href=\"https://docs.oracle.com/en/database/oracle/oracle-database/18/nlspg/datetime-data-types-and-time-zone-support.html#GUID-805AB986-DE12-4FEA-AF56-5AABCD2132DF\">Choosing a Time Zone File</a> ）。</p></li>\n<li><p>MySQL：用 <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/mysql-tzinfo-to-sql.html\">mysql_tzinfo_to_sql</a> 加载时区表。</p></li>\n</ul>\n</aside>\n</section>\n<section id=\"none\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">none()</span></code><a class=\"heading-anchor\" href=\"#none\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.none\">\n<span class=\"sig-name descname\"><span class=\"pre\">none</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.none\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">none()</span></code> 将创建一个永远不会返回任何对象的查询集，在访问结果时将不执行任何查询。<code class=\"docutils literal notranslate\"><span class=\"pre\">qs.none()</span></code> 查询集是 <code class=\"docutils literal notranslate\"><span class=\"pre\">EmptyQuerySet</span></code> 的一个实例。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">none</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models.query</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">EmptyQuerySet</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">none</span><span class=\"p\">(),</span> <span class=\"n\">EmptyQuerySet</span><span class=\"p\">)</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n</section>\n<section id=\"all\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">all()</span></code><a class=\"heading-anchor\" href=\"#all\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.all\">\n<span class=\"sig-name descname\"><span class=\"pre\">all</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.all\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回当前 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> （或 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 子类）的 <em>副本</em>。 这在以下情况下很有用：你可能想传入一个模型管理器或一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，并对结果做进一步过滤。在任何一个对象上调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">all()</span></code> 后，你肯定会有一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 可以使用。</p>\n<p>当一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 被 <a class=\"reference internal\" href=\"#when-querysets-are-evaluated\"><span class=\"std std-ref\">执行</span></a> 时，它通常会缓存其结果。如果数据库中的数据可能在 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 被评估后发生了变化，你可以通过调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">all()</span></code> 对以前执行过的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 进行更新。</p>\n</section>\n<section id=\"union\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">union()</span></code><a class=\"heading-anchor\" href=\"#union\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.union\">\n<span class=\"sig-name descname\"><span class=\"pre\">union</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">other_qs</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">all</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.union\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>使用 SQL 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">UNION</span></code> 操作符来组合两个或多个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的结果。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs1</span><span class=\"o\">.</span><span class=\"n\">union</span><span class=\"p\">(</span><span class=\"n\">qs2</span><span class=\"p\">,</span> <span class=\"n\">qs3</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">UNION</span></code> 操作符默认只选择不同的值。要允许重复的值，使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">all=True</span></code> 参数。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">union()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">intersection()</span></code>, 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">difference()</span></code> 返回第一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 类型的模型实例，即使参数是其他模型的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>。只要所有 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> 列表相同（至少类型相同，名称不重要，只要类型的顺序相同），就可以传递不同的模型。在这种情况下，必须在应用于结果 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 方法中使用来自第一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的列名。例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs1</span> <span class=\"o\">=</span> <span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs2</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs1</span><span class=\"o\">.</span><span class=\"n\">union</span><span class=\"p\">(</span><span class=\"n\">qs2</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>此外，只有 <code class=\"docutils literal notranslate\"><span class=\"pre\">LIMIT</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">OFFSET</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">COUNT(*)</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">ORDER</span> <span class=\"pre\">BY</span></code> 和指定列（即切片、<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.count\" title=\"django.db.models.query.QuerySet.count\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">count()</span></code></a>、<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exists\" title=\"django.db.models.query.QuerySet.exists\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exists()</span></code></a>、<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> 与 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a> ／ <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values_list\" title=\"django.db.models.query.QuerySet.values_list\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values_list()</span></code></a> ）允许在结果 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中使用。此外，数据库对组合查询中允许的操作也有限制。例如，大多数数据库不允许在组合查询中使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">LIMIT</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">OFFSET</span></code>。</p>\n</section>\n<section id=\"intersection\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">intersection()</span></code><a class=\"heading-anchor\" href=\"#intersection\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.intersection\">\n<span class=\"sig-name descname\"><span class=\"pre\">intersection</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">other_qs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.intersection\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>使用 SQL 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">INTERSECT</span></code> 操作符来返回两个或多个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的共享元素。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs1</span><span class=\"o\">.</span><span class=\"n\">intersection</span><span class=\"p\">(</span><span class=\"n\">qs2</span><span class=\"p\">,</span> <span class=\"n\">qs3</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>一些限制见 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.union\" title=\"django.db.models.query.QuerySet.union\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">union()</span></code></a>。</p>\n</section>\n<section id=\"difference\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">difference()</span></code><a class=\"heading-anchor\" href=\"#difference\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.difference\">\n<span class=\"sig-name descname\"><span class=\"pre\">difference</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">other_qs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.difference\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>使用 SQL 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">EXCEPT</span></code> 运算符，只保留在一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中存在而在其他某些 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中不存在的元素。例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs1</span><span class=\"o\">.</span><span class=\"n\">difference</span><span class=\"p\">(</span><span class=\"n\">qs2</span><span class=\"p\">,</span> <span class=\"n\">qs3</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>一些限制见 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.union\" title=\"django.db.models.query.QuerySet.union\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">union()</span></code></a>。</p>\n</section>\n<section id=\"select-related\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code><a class=\"heading-anchor\" href=\"#select-related\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.select_related\">\n<span class=\"sig-name descname\"><span class=\"pre\">select_related</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.select_related\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，它将“跟随”外键关系，在执行查询时选择额外的相关对象数据。这是一个性能提升器，它导致一个更复杂的单一查询，但意味着以后使用外键关系将不需要数据库查询。</p>\n<p>下面的例子说明了普通查找和 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code> 查找之间的区别。下面是标准的查询：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Hits the database.</span>\n<span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Hits the database again to get the related Blog object.</span>\n<span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">blog</span>\n</code></pre></div>\n<p>这里是 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 查找：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Hits the database.</span>\n<span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Doesn&#39;t hit the database, because e.blog has been prepopulated</span>\n<span class=\"c1\"># in the previous query.</span>\n<span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">blog</span>\n</code></pre></div>\n<p>你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code> 来处理任何对象的查询集：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n\n<span class=\"c1\"># Find all the blogs with entries scheduled to be published in the future.</span>\n<span class=\"n\">blogs</span> <span class=\"o\">=</span> <span class=\"nb\">set</span><span class=\"p\">()</span>\n\n<span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__gt</span><span class=\"o\">=</span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">())</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Without select_related(), this would make a database query for each</span>\n    <span class=\"c1\"># loop iteration in order to fetch the related blog for each entry.</span>\n    <span class=\"n\">blogs</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">blog</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code> 的顺序并不重要。这些查询集相当于：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__gt</span><span class=\"o\">=</span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">())</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__gt</span><span class=\"o\">=</span><span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">())</span>\n</code></pre></div>\n<p>你可以用类似于查询外键的方式来跟踪外键。如果你有以下模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">City</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">pass</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">hometown</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">City</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">SET_NULL</span><span class=\"p\">,</span>\n        <span class=\"n\">blank</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">null</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">author</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Person</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>...然后调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">Book.objects.select_related('author__hometown').get(id=4)</span></code> 将缓存相关的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> <em>和</em> 相关的 <code class=\"docutils literal notranslate\"><span class=\"pre\">City</span></code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Hits the database with joins to the author and hometown tables.</span>\n<span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;author__hometown&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">)</span>\n<span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">author</span>  <span class=\"c1\"># Doesn&#39;t hit the database.</span>\n<span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">hometown</span>  <span class=\"c1\"># Doesn&#39;t hit the database.</span>\n\n<span class=\"c1\"># Without select_related()...</span>\n<span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">)</span>  <span class=\"c1\"># Hits the database.</span>\n<span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">author</span>  <span class=\"c1\"># Hits the database.</span>\n<span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">hometown</span>  <span class=\"c1\"># Hits the database.</span>\n</code></pre></div>\n<p>你可以在传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code> 的字段列表中引用任何 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> 关系。</p>\n<p>你也可以在传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 的字段列表中引用一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> 的反方向——也就是说，你可以遍历一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code></a> 回到定义字段的对象上。不指定字段名，而是使用 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">related_name</span></code></a> 作为相关对象上的字段。</p>\n<p>在某些情况下，你可能希望调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code> 来处理很多相关对象，或者你不知道所有的关系。在这些情况下，我们可以调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related()</span></code>，但不使用参数。这将跟随它能找到的所有非空的外键——必须指定可空的外键。在大多数情况下，不建议这样做，因为这可能会使基础查询变得更加复杂，并返回比实际需要的更多数据。</p>\n<p>如果需要清除在过去的 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 调用中添加的相关字段列表，可以将 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> 作为参数传递：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">without_relations</span> <span class=\"o\">=</span> <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>链式调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 的工作方式与其他方法类似，即 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related('foo',</span> <span class=\"pre\">'bar')</span></code> 等同于 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related('foo').select_related('bar')</span></code>。</p>\n</section>\n<section id=\"prefetch-related\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code><a class=\"heading-anchor\" href=\"#prefetch-related\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.prefetch_related\">\n<span class=\"sig-name descname\"><span class=\"pre\">prefetch_related</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">lookups</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.prefetch_related\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，它将在一个批次中自动检索每个指定查询的相关对象。</p>\n<p>这与 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 有类似的目的，二者都是为了阻止因访问相关对象而引起的数据库查询潮，但策略却完全不同。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 的工作方式是创建一个 SQL 连接，并在 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> 语句中包含相关对象的字段。出于这个原因，<code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 在同一个数据库查询中得到相关对象。然而，为了避免因跨越“many”关系进行连接而产生更大的结果集，<code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 仅限于单值关系——外键和一对一。</p>\n<p>另一方面，<code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> 为每个关系执行单独的查找，并在 Python 中执行 'joining'。这使它能够预取不能使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 完成的多对多、多对一和 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericRelation\" title=\"django.contrib.contenttypes.fields.GenericRelation\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericRelation</span></code></a> 对象，除了 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 支持的外键和一对一关系。它还支持预取 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code></a>，但必须限制为同质结果集。例如，只有在查询限制为一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code> 时，才支持预取由 <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code> 引用的对象。</p>\n<p>例如，假设你有这些模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Topping</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Pizza</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">toppings</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Topping</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> (</span><span class=\"si\">%s</span><span class=\"s2\">)&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;, &quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">topping</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"k\">for</span> <span class=\"n\">topping</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()),</span>\n        <span class=\"p\">)</span>\n</code></pre></div>\n<p>并运行：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">[&quot;Hawaiian (ham, pineapple)&quot;, &quot;Seafood (prawns, smoked salmon)&quot;...</span>\n</code></pre></div>\n<p>这样做的问题是，每次 <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza.__str__()</span></code> 要求 <code class=\"docutils literal notranslate\"><span class=\"pre\">self.toppings.all()</span></code> 都要查询数据库，所以 <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza.objects.all()</span></code> 会在 Toppings 表上对 Pizza <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中的 <em>每</em> 项进行查询。</p>\n<p>我们可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> 减少到只有两个查询：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;toppings&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这意味着每一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Pizza</span></code> 都有一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">self.toppings.all()</span></code>；现在每次调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">self.toppings.all()</span></code> 时，不必再去数据库中寻找这些项目，而是在一次查询中填充的预设 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 缓存中找到它们。</p>\n<p>也就是说，所有相关的顶点都将在一次查询中被获取，并被用来制作 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySets</span></code>，其中有一个预先填充的相关结果的缓存；然后这些 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySets</span></code> 被用于 <code class=\"docutils literal notranslate\"><span class=\"pre\">self.toppings.all()</span></code> 的调用。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code> 中的附加查询是在 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 开始执行和主要查询被执行后执行的。</p>\n<p>如果你有一个作为模型实例的可迭代对象，你可以使用 <a class=\"reference internal\" href=\"#django.db.models.prefetch_related_objects\" title=\"django.db.models.prefetch_related_objects\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">prefetch_related_objects()</span></code></a> 函数在这些实例上预取相关属性。</p>\n<p>请注意，主 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的结果缓存和所有指定的相关对象将被完全加载到内存中。这改变了 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySets</span></code> 的典型行为，它通常试图避免在需要之前将所有对象加载到内存中，即使在数据库中执行了一个查询之后。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>请记住，与 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySets</span></code> 一样，任何后续的链式方法，如果意味着不同的数据库查询，将忽略之前缓存的结果，并使用新的数据库查询来检索数据。所以，如果你写了以下内容：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pizzas</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;toppings&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"p\">[</span><span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">pizza</span><span class=\"o\">.</span><span class=\"n\">toppings</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">spicy</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span> <span class=\"k\">for</span> <span class=\"n\">pizza</span> <span class=\"ow\">in</span> <span class=\"n\">pizzas</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>...那么 <code class=\"docutils literal notranslate\"><span class=\"pre\">pizza.toppings.all()</span></code> 已经被预取的事实对你没有帮助。<code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related('toppings')</span></code> 意味着 <code class=\"docutils literal notranslate\"><span class=\"pre\">pizza.toppings.all()</span></code>，但 <code class=\"docutils literal notranslate\"><span class=\"pre\">pizza.toppings.filter()</span></code> 是一个新的、不同的查询。预设缓存在这里帮不上忙，事实上它损害了性能，因为你做了一个你没有使用过的数据库查询。所以要谨慎使用这个功能！</p>\n<p>另外，如果你调用了 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">add()</span></code>、<code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">remove()</span></code>、<code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">clear()</span></code> 或 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">set()</span></code>，在 <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">related</span> <span class=\"pre\">managers</span></code> 上，关系的任何预取缓存将被清除。</p>\n</aside>\n<p>你也可以用普通的 join 语法来做相关字段的相关字段。假设我们在上面的例子中多了一个模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Restaurant</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">pizzas</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Pizza</span><span class=\"p\">,</span> <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;restaurants&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">best_pizza</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">Pizza</span><span class=\"p\">,</span> <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;championed_by&quot;</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>以下都是合法的：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这将预取所有属于餐馆的披萨，以及所有属于这些披萨的配料。这将导致总共 3 个数据库查询——一个查询餐厅，一个查询披萨，一个查询配料。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;best_pizza__toppings&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这将为每家餐厅获取最好的比萨饼和最好的比萨饼的所有配料。这将在 3 个数据库查询中完成——一个查询餐厅，一个查询“最佳披萨”，一个查询配料。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">best_pizza</span></code> 关系也可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 获取，以将查询计数减少到 2：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;best_pizza&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;best_pizza__toppings&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>由于预取是在主查询之后执行的（其中包括 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_related</span></code> 所需要的连接），它能够检测到 <code class=\"docutils literal notranslate\"><span class=\"pre\">best_pizza</span></code> 对象已经被取走了，它将跳过再次取走它们。</p>\n<p>链式调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> 将累积预取的查找。要清除任何 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> 行为，传递 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> 作为参数：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">non_prefetched</span> <span class=\"o\">=</span> <span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>在使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> 时，需要注意的一个区别是，查询创建的对象可以在与其相关的不同对象之间共享，即一个 Python 模型实例可以出现在返回的对象树的多个点上。这通常会发生在外键关系中。通常情况下，这种行为不会有问题，而且事实上会节省内存和 CPU 时间。</p>\n<p>虽然 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> 支持预取 <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code> 关系，但查询次数将取决于数据。由于一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code> 可以引用多个表中的数据，所以需要对每个被引用的表进行一次查询，而不是对所有项目进行一次查询。如果还没有获取相关的行，可以对 <code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code> 表进行额外的查询。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> 在大多数情况下，将使用使用“IN”操作符的 SQL 查询来实现。这意味着对于一个大的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 可能会生成一个大的“IN”子句，这取决于数据库，在解析或执行 SQL 查询时可能会有自己的性能问题。一定要针对自己的用例进行剖析！</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>如果使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code> 运行查询，只有在提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">chunk_size</span></code> 的值时，才会观察到 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code> 调用。</p>\n</aside>\n<p>你可以使用 <a class=\"reference internal\" href=\"#django.db.models.Prefetch\" title=\"django.db.models.Prefetch\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Prefetch</span></code></a> 对象来进一步控制预取操作。</p>\n<p>最简单的形式 <code class=\"docutils literal notranslate\"><span class=\"pre\">Prefetch</span></code> 相当于传统的基于字符串的查找。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Prefetch</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>你可以用可选的 <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</span></code> 参数提供一个自定义查询集。这可以用来改变查询集的默认排序。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Toppings</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)))</span>\n</code></pre></div>\n<p>或者在适用的时候调用 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code>，以进一步减少查询次数。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;restaurants&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;best_pizza&#39;</span><span class=\"p\">)))</span>\n</code></pre></div>\n<p>你也可以用可选的 <code class=\"docutils literal notranslate\"><span class=\"pre\">to_attr</span></code> 参数将预取结果分配给一个自定义属性。结果将直接存储在一个列表中。</p>\n<p>这允许用不同的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 预取同一关系多次；例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">vegetarian_pizzas</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">vegetarian</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;menu&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">vegetarian_pizzas</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;vegetarian_menu&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>使用自定义 <code class=\"docutils literal notranslate\"><span class=\"pre\">to_attr</span></code> 创建的查找仍然可以像往常一样被其他查找遍历。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">vegetarian_pizzas</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">vegetarian</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">vegetarian_pizzas</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;vegetarian_menu&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"s1\">&#39;vegetarian_menu__toppings&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>在对预取结果进行过滤时，建议使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">to_attr</span></code>，因为它比将过滤后的结果存储在相关管理器的缓存中更不含糊。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">queryset</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">vegetarian</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Recommended:</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">restaurants</span> <span class=\"o\">=</span> <span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">queryset</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;vegetarian_pizzas&#39;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">vegetarian_pizzas</span> <span class=\"o\">=</span> <span class=\"n\">restaurants</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">vegetarian_pizzas</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Not recommended:</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">restaurants</span> <span class=\"o\">=</span> <span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">queryset</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">vegetarian_pizzas</span> <span class=\"o\">=</span> <span class=\"n\">restaurants</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">pizzas</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>自定义预取也适用于单一的相关关系，如前向 <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></code>。一般来说，你会希望使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> 来处理这些关系，但在一些情况下，使用自定义 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 进行预取是有用的。</p>\n<ul>\n<li><p>你要使用一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，对相关模型进行进一步的预取。</p></li>\n<li><p>你想只预取相关对象的一个子集。</p></li>\n<li><p>你要使用性能优化技术，比如 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">递延字段</span></code></a>。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">queryset</span> <span class=\"o\">=</span> <span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">restaurants</span> <span class=\"o\">=</span> <span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;best_pizza&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">queryset</span><span class=\"p\">))</span>\n</code></pre></div>\n</li>\n</ul>\n<p>在使用多个数据库时，<code class=\"docutils literal notranslate\"><span class=\"pre\">Prefetch</span></code> 将尊重您的数据库选择。如果内部查询没有指定数据库，它将使用外部查询选择的数据库。以下所有方式都是有效的：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Both inner and outer queries will use the &#39;replica&#39; database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s2\">&quot;replica&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s2\">&quot;replica&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Inner will use the &#39;replica&#39; database; outer will use &#39;default&#39; database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Toppings</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s2\">&quot;replica&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Inner will use &#39;replica&#39; database; outer will use &#39;cold-storage&#39; database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Toppings</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s2\">&quot;replica&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s2\">&quot;cold-storage&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>查询的顺序很重要。</p>\n<p>下面举例说明：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>即使它是无序的，这也是可行的，因为 <code class=\"docutils literal notranslate\"><span class=\"pre\">'pizzas__toppings'</span></code> 已经包含了所有需要的信息，因此第二个参数 <code class=\"docutils literal notranslate\"><span class=\"pre\">'pizzas'</span></code> 实际上是多余的。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas__toppings&#39;</span><span class=\"p\">,</span> <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">Pizza</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()))</span>\n</code></pre></div>\n<p>这将引发一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code>，因为它试图重新定义一个先前看到的查询的查询集。请注意，一个隐式查询集被创建为遍历 <code class=\"docutils literal notranslate\"><span class=\"pre\">''pizzas'</span></code> 作为 <code class=\"docutils literal notranslate\"><span class=\"pre\">''pizzas__toppings'</span></code> 查询的一部分。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizza_list__toppings&#39;</span><span class=\"p\">,</span> <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;pizzas&#39;</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;pizza_list&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>这将触发一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">AttributeError</span></code>，因为 <code class=\"docutils literal notranslate\"><span class=\"pre\">'pizza_list'</span></code> 在处理 <code class=\"docutils literal notranslate\"><span class=\"pre\">'pizza_list__toppings'</span></code> 时还不存在。</p>\n<p>这种考虑不限于使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">Prefetch</span></code> 对象。一些高级技术可能要求按照特定的顺序进行查找，以避免产生额外的查询；因此，建议总是仔细地安排 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> 参数的顺序。</p>\n</aside>\n</section>\n<section id=\"extra\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code><a class=\"heading-anchor\" href=\"#extra\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.extra\">\n<span class=\"sig-name descname\"><span class=\"pre\">extra</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">select</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">where</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">params</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">tables</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">order_by</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">select_params</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.extra\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>有时候，Django 查询语法本身并不能很容易地表达一个复杂的 <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> 子句。对于这些边缘情况，Django 提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code> <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 修饰符——用于将特定的子句注入到由 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 生成的 SQL 中。</p>\n<aside class=\"admonition-use-this-method-as-a-last-resort admonition\">\n<p class=\"admonition-title\">在万不得已的情况下使用这种方法</p>\n<p>这是一个老的 API，我们的目标是在未来的某个时间点废弃。只有当你不能使用其他的查询集方法来表达你的查询时才使用它。如果你确实需要使用它，请使用 <a class=\"reference external\" href=\"https://code.djangoproject.com/query?status=assigned&amp;status=new&amp;keywords=~QuerySet.extra\">QuerySet.extra keyword</a> 并和你的用例（请先检查现有的工单列表）一起 <a class=\"reference external\" href=\"https://code.djangoproject.com/newticket\">file a ticket</a> ，这样我们就可以增强 QuerySet API 以允许删除 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code>。我们不再改进或修复该方法的错误。</p>\n<p>例如，<code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code> 的这种用法：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">select</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;val&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;select col from sometable where othercol = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">},</span>\n<span class=\"gp\">... </span>    <span class=\"n\">select_params</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">someparam</span><span class=\"p\">,),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>相当于：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">val</span><span class=\"o\">=</span><span class=\"n\">RawSQL</span><span class=\"p\">(</span><span class=\"s2\">&quot;select col from sometable where othercol = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">someparam</span><span class=\"p\">,)))</span>\n</code></pre></div>\n<p>使用 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/expressions/#django.db.models.expressions.RawSQL\" title=\"django.db.models.expressions.RawSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RawSQL</span></code></a> 的主要好处是，如果需要的话，可以设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code>。主要的缺点是，如果你在原始 SQL 中引用了查询集的某个表的别名，那么 Django 有可能会改变这个别名（例如，当查询集在另一个查询中被用作子查询时）。</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>每当你使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code> 时，你应该非常小心。每次使用它时，你应该使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> 来转义任何用户可以控制的参数，以防止 SQL 注入攻击。</p>\n<p>你也不能在 SQL 字符串中引用占位符。这个例子因为在 <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code> 周围的引号而容易受到 SQL 注入的影响。</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">sometable</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">othercol</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;%s&#39;</span><span class=\"w\">  </span><span class=\"o\">#</span><span class=\"w\"> </span><span class=\"n\">unsafe</span><span class=\"o\">!</span>\n</code></pre></div>\n<p>你可以阅读更多关于 Django 的 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/security/#sql-injection-protection\"><span class=\"std std-ref\">SQL 注入保护</span></a> 的工作原理。</p>\n</aside>\n<p>根据定义，这些额外的查找可能无法移植到不同的数据库引擎中（因为你明确地编写了 SQL 代码），并且违反了 DRY 原则，所以你应该尽可能地避免它们。</p>\n<p>指定 <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code> 中的一个或多个参数。这些参数都不是必须的，但你应该至少使用其中的一个。</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code></p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code> 参数让你在 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> 子句中放入额外的字段。 它应该是一个将属性名映射到 SQL 子句的字典，用于计算该属性。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">select</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;is_recent&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;pub_date &gt; &#39;2006-01-01&#39;&quot;</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>因此，每个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> 对象将有一个额外的属性，<code class=\"docutils literal notranslate\"><span class=\"pre\">is_recent</span></code>，一个布尔值，表示该条目的 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 是否大于 2006 年 1 月 1 日。</p>\n<p>Django 将给定的 SQL 片段直接插入到 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> 语句中，所以上面例子的 SQL 结果将是这样的。</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"n\">blog_entry</span><span class=\"p\">.</span><span class=\"o\">*</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"s1\">&#39;2006-01-01&#39;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">AS</span><span class=\"w\"> </span><span class=\"n\">is_recent</span>\n<span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">blog_entry</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>下一个例子更高级；它做了一个子查询，给每个结果的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code> 对象一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">entry_count</span></code> 属性，一个相关 <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> 对象的整数：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span>\n    <span class=\"n\">select</span><span class=\"o\">=</span><span class=\"p\">{</span>\n        <span class=\"s2\">&quot;entry_count&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id&quot;</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>在这个特殊的情况下，我们利用了这样一个事实，即查询在其 <code class=\"docutils literal notranslate\"><span class=\"pre\">FROM</span></code> 子句中已经包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog_blog</span></code> 表。</p>\n<p>上述例子的 SQL 结果是：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"n\">blog_blog</span><span class=\"p\">.</span><span class=\"o\">*</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"k\">COUNT</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">blog_entry</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">blog_entry</span><span class=\"p\">.</span><span class=\"n\">blog_id</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">blog_blog</span><span class=\"p\">.</span><span class=\"n\">id</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">AS</span><span class=\"w\"> </span><span class=\"n\">entry_count</span>\n<span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">blog_blog</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>需要注意的是，大多数数据库引擎要求在子查询周围加上括号，而 Django 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code> 子句则不需要。还需要注意的是，一些数据库后端，比如一些 MySQL 版本，不支持子查询。</p>\n<p>在一些罕见的情况下，你可能希望在 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra(select=...)</span></code> 中给 SQL 片段传递参数。为此，使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_params</span></code> 参数。</p>\n<p>这样做就可以了，比如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span>\n    <span class=\"n\">select</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;b&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">},</span>\n    <span class=\"n\">select_params</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;one&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;two&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你需要在选择字符串中使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code>，请使用序列 <code class=\"docutils literal notranslate\"><span class=\"pre\">%%s</span></code>。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code>／<code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code></p>\n<p>你可以通过使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> 来定义明确的 SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> 子句——也许是为了执行非明确的连接。你可以通过使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code> 手动添加表到 SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">FROM</span></code> 子句中。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code> 都采用一个字符串列表。所有 <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> 参数都与任何其他搜索标准“AND”在一起。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">where</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;foo=&#39;a&#39; OR bar = &#39;a&#39;&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;baz = &#39;a&#39;&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>...翻译成（大致）下面的 SQL：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">blog_entry</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">foo</span><span class=\"o\">=</span><span class=\"s1\">&#39;a&#39;</span><span class=\"w\"> </span><span class=\"k\">OR</span><span class=\"w\"> </span><span class=\"n\">bar</span><span class=\"o\">=</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">AND</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">baz</span><span class=\"o\">=</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code> 参数时，要注意指定查询中已经使用过的表，当你通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code> 参数添加额外的表时，Django 会认为你希望额外包含该表，如果已经包含的话。当你通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">tables</span></code> 参数添加额外的表时，Django 会认为你希望额外地包含该表，如果它已经被包含了。这就会产生一个问题，因为表名会被赋予一个别名。如果一个表在一条 SQL 语句中多次出现，那么第二次和后续的表必须使用别名，这样数据库才能区分它们。如果你指的是你在额外的 <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> 参数中添加的额外表，这就会造成错误。</p>\n<p>一般情况下，你只会添加查询中还没有出现的额外表。但是，如果确实出现了上面概述的情况，有几种解决办法。首先，看看是否可以不包含额外的表，而使用已经在查询中出现的表。如果不可能的话，把你的 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code> 调用放在查询集构造的前面，这样你的表就是那个表的第一次使用。最后，如果所有其他方法都失败了，看一下产生的查询，重写你的 <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> 加法，使用给你的额外表的别名。每次以同样的方式构造查询集时，别名都会是一样的，所以你可以信赖别名不会改变。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">order_by</span></code></p>\n<p>如果你需要使用你通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code> 所包含的一些新字段或表来对结果查询集进行排序，请使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by</span></code> 参数，并传入一串字符串。这些字符串应该是模型字段（就像在查询集上的普通 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> 方法一样），形式为 <code class=\"docutils literal notranslate\"><span class=\"pre\">table_name.column_name</span></code> 或者是你在 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">select</span></code> 参数中指定的列的别名。</p>\n<p>例子：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">select</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;is_recent&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;pub_date &gt; &#39;2006-01-01&#39;&quot;</span><span class=\"p\">})</span>\n<span class=\"n\">q</span> <span class=\"o\">=</span> <span class=\"n\">q</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">order_by</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;-is_recent&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>这将把 <code class=\"docutils literal notranslate\"><span class=\"pre\">is_recent</span></code> 为真的所有项目排在结果集的前面（<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 按降序排列在 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 之前）。</p>\n<p>顺便说一下，这表明你可以多次调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">extra()</span></code>，它将按照你的期望行事（每次增加新的约束）。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code></p>\n<p>上面描述的 <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code> 参数可以使用标准的 Python 数据库字符串占位符——<code class=\"docutils literal notranslate\"><span class=\"pre\">'%s'</span></code> 来表示数据库引擎应该自动引用的参数。<code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> 参数是一个要被替换的额外参数的列表。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">where</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;headline=</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">],</span> <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>始终使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> 而不是直接将值嵌入 <code class=\"docutils literal notranslate\"><span class=\"pre\">where</span></code>，因为 <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> 将确保根据你的特定后台正确引用值。例如，引号将被正确转义。</p>\n<p>不好的：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">where</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;headline=&#39;Lennon&#39;&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>正确的：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">extra</span><span class=\"p\">(</span><span class=\"n\">where</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;headline=</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">],</span> <span class=\"n\">params</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n</li>\n</ul>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>如果你在 MySQL 上执行查询，请注意 MySQL 的静默强制类型转换可能会在混合类型时导致意外的结果。如果你在一个字符串类型的列上查询，但却有一个整数值，MySQL 会在执行比较之前将表中所有值的类型强制转换为整数。例如，如果你的表中包含值 <code class=\"docutils literal notranslate\"><span class=\"pre\">'abc'</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">'def'</span></code>，而你查询 <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span> <span class=\"pre\">mycolumn=0</span></code>，这两行都会匹配。为了防止这种情况发生，在查询中使用该值之前，请执行正确的类型转换。</p>\n</aside>\n</section>\n<section id=\"defer\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code><a class=\"heading-anchor\" href=\"#defer\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.defer\">\n<span class=\"sig-name descname\"><span class=\"pre\">defer</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.defer\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在一些复杂的数据建模情况下，你的模型可能包含很多字段，其中一些字段可能包含很多数据（例如，文本字段），或者需要昂贵的处理来将它们转换为 Python 对象。如果你在某些情况下使用查询集的结果，在最初获取数据时不知道是否需要这些特定的字段，你可以告诉 Django 不要从数据库中检索这些字段。</p>\n<p>通过将不加载的字段名称传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>一个有递延字段的查询集仍然会返回模型实例。如果你访问每个递延字段，将从数据库中检索该字段（一次一个，而不是同时访问所有的递延字段）。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>延迟加载的字段不会像这样从异步代码中惰性加载。相反，你将得到一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">SynchronousOnlyOperation</span></code> 异常。如果你正在编写异步代码，不应尝试访问任何你已经使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> 推迟加载的字段。</p>\n</aside>\n<p>你可以多次调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code>。每次调用都会在推迟的集合中增加新的字段：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Defers both the body and headline fields.</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">rating</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>字段被添加到递延集的顺序并不重要。用已经被递延的字段名调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> 是无害的（该字段仍将被递延）。</p>\n<p>你可以通过使用标准的双下划线符号来分隔相关的字段，来推迟加载相关模型中的字段（如果相关模型是通过 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> 加载的）：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry__headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;entry__body&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你想清除一组递延字段，将 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> 作为参数传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Load all fields immediately.</span>\n<span class=\"n\">my_queryset</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>模型中的一些字段不会被推迟，即使你要求它们。你永远不能推迟加载主键。如果你使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> 来检索相关的模型，你不应该推迟从主模型连接到相关模型的字段的加载，这样做会导致一个错误。</p>\n<p>类似地，从聚合调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> （或其对应的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">only()</span></code></a>）包括一个参数是没有意义的（例如使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a> 的结果）。这样做将引发异常。聚合值将始终被提取到生成的查询集中。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> 方法（和它的表兄弟 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">only()</span></code></a>，见下面）只适用于进阶使用情况。它们提供了一种优化，当你仔细分析了你的查询，了解了你所需要的 <em>确切</em> 的信息，并且测算出返回你所需要的字段和模型的全部字段集之间的差异会很大。</p>\n<p>即使你认为自己处于高级用例情况下，<strong>只有在在查询集加载时无法确定是否需要额外字段时才使用</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code>。如果你经常加载和使用数据的特定子集，你可以做出的最好选择是将模型进行规范化，并将未加载的数据放入一个单独的模型（和数据库表中）。如果出于某种原因列 <em>必须</em> 保留在一个表中，请创建一个具有 <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta.managed</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code> （请参阅 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/options/#django.db.models.Options.managed\" title=\"django.db.models.Options.managed\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">managed</span> <span class=\"pre\">属性</span></code></a> 文档）的模型，其中仅包含您通常需要加载和使用的字段，然后在可能会调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> 的地方使用它。这使得你的代码对读者更加明确，速度略快，Python 进程中消耗的内存也略少。</p>\n<p>例如，这两种模式都使用相同的基础数据库表：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CommonlyUsedModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">f1</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">managed</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n        <span class=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;app_largetable&quot;</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ManagedModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">f1</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n    <span class=\"n\">f2</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;app_largetable&quot;</span>\n\n\n<span class=\"c1\"># Two equivalent QuerySets:</span>\n<span class=\"n\">CommonlyUsedModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"n\">ManagedModel</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;f2&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果很多字段需要在非托管模型中重复，最好的办法是创建一个共享字段的抽象模型，然后让非托管模型和托管模型从抽象模型中继承。</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>当调用 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> 对有延迟字段的实例进行保存时，只有加载的字段会被保存。更多细节请参见 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a>。</p>\n</aside>\n</section>\n<section id=\"only\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code><a class=\"heading-anchor\" href=\"#only\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.only\">\n<span class=\"sig-name descname\"><span class=\"pre\">only</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.only\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> 方法实际上是 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">defer()</span></code></a> 的相反。只有传递到此方法中的字段，并且尚未指定为延迟加载的字段，在查询集评估时会立即加载。</p>\n<p>如果你有一个几乎所有字段都需要延迟加载的模型，使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> 来指定补充的字段集合可以简化代码。</p>\n<p>假设你有一个模型，其字段为 <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">age</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">biography</span></code>。就递延字段而言，以下两个查询集是相同的：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;age&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;biography&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>每当你调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> 时，它就会 <em>替换</em> 要立即加载的字段集。该方法的名称是记号式的：<strong>仅</strong> 那些字段被立即加载；其余的字段被推迟。因此，连续调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> 的结果是只考虑最后的字段：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># This will defer all fields except the headline.</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;rating&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>由于 <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> 以递增的方式行事（将字段添加到递延列表中），你可以将对 <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> 的调用结合起来，事情就会符合逻辑：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Final result is that everything except &quot;headline&quot; is deferred.</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Final result loads headline immediately.</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">defer</span><span class=\"p\">(</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">only</span><span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;body&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">defer()</span></code></a> 文档注释中的所有注意事项也适用于 <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code>。谨慎使用，只有在用尽其他选项后才能使用。</p>\n<p>使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> 并省略使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> 请求的字段也是错误的。另一方面，如果在没有任何参数的情况下调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code>，将返回查询集提取的每个字段（包括注释）。</p>\n<p>与 <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> 一样，你不能从异步代码中访问未加载的字段并期望它们加载。相反，你将得到一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">SynchronousOnlyOperation</span></code> 异常。确保你可能访问的所有字段都在你的 <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> 调用中。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>当调用 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> 对有延迟字段的实例进行保存时，只有加载的字段会被保存。更多细节请参见 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a>。</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>在在 <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> 之后使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">defer()</span></code></a> 时，<code class=\"docutils literal notranslate\"><span class=\"pre\">defer</span></code> 中的字段将覆盖在两者中都列出的字段的 <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code>。</p>\n</aside>\n</section>\n<section id=\"using\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">using()</span></code><a class=\"heading-anchor\" href=\"#using\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.using\">\n<span class=\"sig-name descname\"><span class=\"pre\">using</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">alias</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.using\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>如果你使用多个数据库，该方法用于控制 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 将针对哪个数据库进行评估。 本方法的唯一参数是数据库的别名，定义在 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> 中。</p>\n<p>例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"go\"># queries the database with the &#39;default&#39; alias.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n\n<span class=\"go\"># queries the database with the &#39;backup&#39; alias</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"s2\">&quot;backup&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"select-for-update\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code><a class=\"heading-anchor\" href=\"#select-for-update\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.select_for_update\">\n<span class=\"sig-name descname\"><span class=\"pre\">select_for_update</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">nowait</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">skip_locked</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">of</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">()</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">no_key</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.select_for_update\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>返回一个查询集，该查询集将锁定行直到事务结束，从而在受支持的数据库上生成 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code> SQL 语句。</p>\n<p>例子：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">transaction</span>\n\n<span class=\"n\">entries</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_for_update</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">author</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"p\">)</span>\n<span class=\"k\">with</span> <span class=\"n\">transaction</span><span class=\"o\">.</span><span class=\"n\">atomic</span><span class=\"p\">():</span>\n    <span class=\"k\">for</span> <span class=\"n\">entry</span> <span class=\"ow\">in</span> <span class=\"n\">entries</span><span class=\"p\">:</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>当查询集被执行时（这里是 <code class=\"docutils literal notranslate\"><span class=\"pre\">for</span> <span class=\"pre\">entry</span> <span class=\"pre\">in</span> <span class=\"pre\">entries</span></code>），所有匹配的条目将被锁定，直到事务块结束，这意味着其他事务将被阻止改变或获取它们的锁。</p>\n<p>通常情况下，如果另一个事务已经获得了所选行的锁，那么查询将被阻塞，直到锁被释放。如果这不是你想要的行为，调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update(nowait=True)</span></code>。这将使调用非阻塞。如果一个冲突的锁已经被另一个事务获取，那么当查询集被评估时，将引发 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/exceptions/#django.db.DatabaseError\" title=\"django.db.DatabaseError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">DatabaseError</span></code></a>。你也可以通过使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update(</span> <span class=\"pre\">skip_locked=True)</span></code> 来忽略锁定的记录。<code class=\"docutils literal notranslate\"><span class=\"pre\">nowait</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">skip_locked</span></code> 是相互排斥的，在启用这两个选项的情况下调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> 会导致一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#ValueError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValueError</span></code></a>。</p>\n<p>默认情况下，<code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> 锁定所有被查询选择的行。例如，在 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> 中指定的相关对象的行，除了查询集模型的行之外，也会被锁定。如果不希望这样，可以在 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update(of=(...))</span></code> 中使用与 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> 相同的字段语法指定你要锁定的相关对象。使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">'self'</span></code> 来表示查询集的模型。</p>\n<aside class=\"admonition-lock-parents-models-in-select-for-update-of admonition\">\n<p class=\"admonition-title\">在 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update(of=(...))</span></code> 中锁定父模型</p>\n<p>如果在使用 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/models/#multi-table-inheritance\"><span class=\"std std-ref\">多表继承</span></a> 时要锁定父模型，必须在 <code class=\"docutils literal notranslate\"><span class=\"pre\">of</span></code> 参数中指定父链接字段（默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;parent_model_name&gt;_ptr</span></code>）。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_for_update</span><span class=\"p\">(</span><span class=\"n\">of</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;self&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;place_ptr&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</aside>\n<aside class=\"admonition-using-select-for-update-of-with-specified-fields admonition\">\n<p class=\"admonition-title\">在指定的字段使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update(of=(...))</span></code></p>\n<p>如果你想锁定模型并指定选定的字段，例如使用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a>，你必须从每个模型的 <code class=\"docutils literal notranslate\"><span class=\"pre\">of</span></code> 参数中至少选择一个字段。没有选定字段的模型将不会被锁定。</p>\n</aside>\n<p>仅在 PostgreSQL 上，你可以通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">no_key=True</span></code> 来获得一个较弱的锁，这仍然允许在锁存在的情况下，创建仅仅引用锁定的行（例如，通过外键）。PostgreSQL 文档中有更多关于 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/explicit-locking.html#LOCKING-ROWS\">行级锁模式的细节</a> 。</p>\n<p>你不能在可空关联上使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code>：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;hometown&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">select_for_update</span><span class=\"p\">()</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n<span class=\"c\">...</span>\n<span class=\"gr\">django.db.utils.NotSupportedError</span>: <span class=\"n\">FOR UPDATE cannot be applied to the nullable side of an outer join</span>\n</code></pre></div>\n<p>为了避免这个限制，如果你不关心空对象，可以将它们排除在外：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">select_related</span><span class=\"p\">(</span><span class=\"s2\">&quot;hometown&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">select_for_update</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">exclude</span><span class=\"p\">(</span><span class=\"n\">hometown</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Person: ...)&gt;, ...]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">postgresql</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">oracle</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">mysql</span></code> 数据库后端支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code>。但是，MariaDB 仅支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">nowait</span></code> 参数，MariaDB 10.6+ 还支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">skip_locked</span></code> 参数，而 MySQL 8.0.1+ 支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">nowait</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">skip_locked</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">of</span></code> 参数。<code class=\"docutils literal notranslate\"><span class=\"pre\">no_key</span></code> 参数仅在 PostgreSQL 上受支持。</p>\n<p>在使用不支持这些选项的数据库后端（如 MySQL）向 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()``传递</span> <span class=\"pre\">``nowait=True</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">skip_locked=True</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">no_key=True</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">of</span></code>，会产生一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/exceptions/#django.db.NotSupportedError\" title=\"django.db.NotSupportedError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">NotSupportedError</span></code></a>。这可以防止代码意外地阻塞。</p>\n<p>在支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code> 的后端上，用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> 在自动提交模式下执行一个查询集是一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/exceptions/#django.db.transaction.TransactionManagementError\" title=\"django.db.transaction.TransactionManagementError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">TransactionManagementError</span></code></a> 错误，因为在这种情况下行没有被锁定。如果允许这样做，这将促进数据损坏，并且很容易通过调用期望在一个事务之外的事务中运行的代码而引起。</p>\n<p>在不支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code> 的后端（比如 SQLite）使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> 不会有任何影响。<code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code> 不会被添加到查询中，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> 在自动提交模式下使用，也不会出现错误。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>虽然 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> 通常在自动提交模式下会失败，但由于 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TestCase</span></code></a> 会自动将每个测试封装在一个事务中，因此在一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code> 中调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> 甚至在 <code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()`()</span></code> 块外调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> 会（也许会出乎意料地）通过而不会引发 <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionManagementError</span></code>。为了正确测试 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code>，你应该使用 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/testing/tools/#django.test.TransactionTestCase\" title=\"django.test.TransactionTestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code></a>。</p>\n</aside>\n<aside class=\"admonition-certain-expressions-may-not-be-supported admonition\">\n<p class=\"admonition-title\">可能不支持某些表达方式</p>\n<p>PostgreSQL 不支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> 与 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/expressions/#django.db.models.expressions.Window\" title=\"django.db.models.expressions.Window\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Window</span></code></a> 表达式。</p>\n</aside>\n</section>\n<section id=\"raw\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code><a class=\"heading-anchor\" href=\"#raw\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.raw\">\n<span class=\"sig-name descname\"><span class=\"pre\">raw</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">raw_query</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">params</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">()</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">translations</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.raw\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>获取一个原始 SQL 查询，执行它，并返回一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.query.RawQuerySet</span></code> 实例。这个 <code class=\"docutils literal notranslate\"><span class=\"pre\">RawQuerySet</span></code> 实例可以像普通的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 一样进行迭代，提供对象实例。</p>\n<p>更多信息请参见 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/sql/\"><span class=\"doc\">执行原生 SQL 查询</span></a>。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code> 总是触发一个新的查询，并且不考虑以前的过滤。因此，它通常应该从 <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> 或从一个新的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 实例中调用。</p>\n</aside>\n</section>\n</section>\n<section id=\"operators-that-return-new-querysets\">\n<h3>返回新 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的操作符<a class=\"heading-anchor\" href=\"#operators-that-return-new-querysets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>组合的查询集必须使用相同的模型。</p>\n<section id=\"and\">\n<h4>AND（<code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;</span></code>）<a class=\"heading-anchor\" href=\"#and\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>使用 SQL 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">AND</span></code> 运算符以类似于链接过滤器的方式合并两个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>。</p>\n<p>以下的都是相同的：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"k\">AND</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span>\n</code></pre></div>\n</section>\n<section id=\"or\">\n<h4>OR（<code class=\"docutils literal notranslate\"><span class=\"pre\">|</span></code>）<a class=\"heading-anchor\" href=\"#or\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>使用 SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">OR</span></code> 操作符将两个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 组合起来。</p>\n<p>以下的都是相同的：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">|</span> <span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Q</span>\n\n<span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">|</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"k\">OR</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">|</span></code> 不是一个换元运算，因为可能会产生不同的（虽然是等价的）查询。</p>\n</section>\n<section id=\"xor\">\n<h4>XOR (<code class=\"docutils literal notranslate\"><span class=\"pre\">^</span></code>)<a class=\"heading-anchor\" href=\"#xor\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<aside class=\"version-note version-added\" data-version=\"4.1\">\n<p class=\"version-note-title\">New in Django 4.1</p></aside>\n<p>使用 SQL 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">XOR</span></code> 运算符合并两个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>。</p>\n<p>以下的都是相同的：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">^</span> <span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Q</span>\n\n<span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">^</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"n\">XOR</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mi\">2</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">XOR</span></code> 在 MariaDB 和 MySQL 上受到原生支持。在其他数据库上，<code class=\"docutils literal notranslate\"><span class=\"pre\">x</span> <span class=\"pre\">^</span> <span class=\"pre\">y</span> <span class=\"pre\">^</span> <span class=\"pre\">...</span> <span class=\"pre\">^</span> <span class=\"pre\">z</span></code> 会被转换为等效的形式：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"k\">OR</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"k\">OR</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">OR</span><span class=\"w\"> </span><span class=\"n\">z</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">AND</span>\n<span class=\"mi\">1</span><span class=\"o\">=</span><span class=\"p\">(</span>\n<span class=\"w\">    </span><span class=\"p\">(</span><span class=\"k\">CASE</span><span class=\"w\"> </span><span class=\"k\">WHEN</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"k\">THEN</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"k\">ELSE</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"k\">END</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span>\n<span class=\"w\">    </span><span class=\"p\">(</span><span class=\"k\">CASE</span><span class=\"w\"> </span><span class=\"k\">WHEN</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"k\">THEN</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"k\">ELSE</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"k\">END</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span>\n<span class=\"w\">    </span><span class=\"p\">...</span>\n<span class=\"w\">    </span><span class=\"p\">(</span><span class=\"k\">CASE</span><span class=\"w\"> </span><span class=\"k\">WHEN</span><span class=\"w\"> </span><span class=\"n\">z</span><span class=\"w\"> </span><span class=\"k\">THEN</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"k\">ELSE</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"k\">END</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n</section>\n<section id=\"methods-that-do-not-return-querysets\">\n<h3>不返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的方法<a class=\"heading-anchor\" href=\"#methods-that-do-not-return-querysets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>以下 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 方法执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，并返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 以外的东西。</p>\n<p>这些方法不使用缓存（参见 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/queries/#caching-and-querysets\"><span class=\"std std-ref\">缓存和 QuerySet</span></a>）。相反，它们每次被调用时都会查询数据库。</p>\n<p>因为这些方法评估了 QuerySet，它们是阻塞调用，因此它们的主要（同步）版本不能从异步代码中调用。因此，每个方法都有一个带有 <code class=\"docutils literal notranslate\"><span class=\"pre\">a</span></code> 前缀的相应异步版本 - 例如，你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">await</span> <span class=\"pre\">aget(…)</span></code> 而不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">get(…)</span></code>。</p>\n<p>通常，除了它们的异步性质之外，它们的行为没有太大区别，但任何差异都在下面的方法旁边进行了说明。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>每个方法的异步版本，以 <code class=\"docutils literal notranslate\"><span class=\"pre\">a</span></code> 为前缀添加。</p>\n</aside>\n<section id=\"get\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code><a class=\"heading-anchor\" href=\"#get\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.get\">\n<span class=\"sig-name descname\"><span class=\"pre\">get</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.get\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aget\">\n<span class=\"sig-name descname\"><span class=\"pre\">aget</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aget\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aget()</span></code></p>\n<p>返回与给定的查找参数相匹配的对象，其格式应该在 <a class=\"reference internal\" href=\"#id4\">Field lookups</a> 中描述。你应该使用保证唯一的查询，比如主键或唯一约束中的字段。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">blog</span><span class=\"o\">=</span><span class=\"n\">blog</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">entry_number</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>如果你希望一个查询集已经返回一条记录，你可以在没有任何参数的情况下使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> 来返回该行的对象：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> 没有找到任何对象，它会引发一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/class/#django.db.models.Model.DoesNotExist\" title=\"django.db.models.Model.DoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Model.DoesNotExist</span></code></a> 异常：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=-</span><span class=\"mi\">999</span><span class=\"p\">)</span>  <span class=\"c1\"># raises Entry.DoesNotExist</span>\n</code></pre></div>\n<p>如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> 发现多个对象，会引发一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/class/#django.db.models.Model.MultipleObjectsReturned\" title=\"django.db.models.Model.MultipleObjectsReturned\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Model.MultipleObjectsReturned</span></code></a> 异常：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;A Duplicated Name&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># raises Entry.MultipleObjectsReturned</span>\n</code></pre></div>\n<p>这两个异常类都是模型类的属性，并且特定于该模型。如果你想对不同模型的多个 <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> 调用处理这样的异常，可以使用它们的通用基类。例如，你可以使用 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist\" title=\"django.core.exceptions.ObjectDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">django.core.exceptions.ObjectDoesNotExist</span></code></a> 来处理 <code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">DoesNotExist</span></code> 来自多个模型的异常：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ObjectDoesNotExist</span>\n\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">blog</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n    <span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">blog</span><span class=\"o\">=</span><span class=\"n\">blog</span><span class=\"p\">,</span> <span class=\"n\">entry_number</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"k\">except</span> <span class=\"n\">ObjectDoesNotExist</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Either the blog or entry doesn&#39;t exist.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">aget()</span></code> 方法已添加。</p>\n</aside>\n</section>\n<section id=\"create\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">create()</span></code><a class=\"heading-anchor\" href=\"#create\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.create\">\n<span class=\"sig-name descname\"><span class=\"pre\">create</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.acreate\">\n<span class=\"sig-name descname\"><span class=\"pre\">acreate</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.acreate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">acreate()</span></code></p>\n<p>一种方便的方法，用于创建一个对象并一步到位地保存。 因此：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Bruce&quot;</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Springsteen&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>和：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Bruce&quot;</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Springsteen&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">force_insert</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>是等效的。</p>\n<p><a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/instances/#ref-models-force-insert\"><span class=\"std std-ref\">force_insert</span></a> 参数在其他地方有说明，但它的意思是总是会创建一个新的对象。通常情况下，你不需要担心这个问题。但是，如果你的模型中包含了一个你设置的手动主键值，而且如果这个值已经存在于数据库中，那么对 <code class=\"docutils literal notranslate\"><span class=\"pre\">create()</span></code> 的调用就会以一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code></a> 失败，因为主键必须是唯一的。如果使用手动主键，要做好处理异常的准备。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">acreate()</span></code> 方法已添加。</p>\n</aside>\n</section>\n<section id=\"get-or-create\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code><a class=\"heading-anchor\" href=\"#get-or-create\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.get_or_create\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_or_create</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">defaults</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.get_or_create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aget_or_create\">\n<span class=\"sig-name descname\"><span class=\"pre\">aget_or_create</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">defaults</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aget_or_create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aget_or_create()</span></code></p>\n<p>一个方便的方法，用于查找具有给定 <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> 的对象（如果你的模型对所有字段都有默认值，则可能为空），必要时创建一个对象。</p>\n<p>返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">(object,</span> <span class=\"pre\">created)</span></code> 的元组，其中 <code class=\"docutils literal notranslate\"><span class=\"pre\">object</span></code> 是检索或创建的对象，<code class=\"docutils literal notranslate\"><span class=\"pre\">created</span></code> 是指定是否创建新对象的布尔值。</p>\n<p>这是为了防止在并行进行请求时创建重复的对象，并作为样板代码的快捷方式。 例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">except</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><span class=\"p\">:</span>\n    <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">,</span> <span class=\"n\">birthday</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1940</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"mi\">9</span><span class=\"p\">))</span>\n    <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>在这里，如果是并发请求，可能会多次尝试用相同的参数保存一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code>。为了避免这种竞争条件，可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> 重写上面的例子，比如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">obj</span><span class=\"p\">,</span> <span class=\"n\">created</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span>\n    <span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">defaults</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;birthday&quot;</span><span class=\"p\">:</span> <span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1940</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"mi\">9</span><span class=\"p\">)},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>任何传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> 的关键字参数—— <em>除了</em> 一个叫 <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> 的可选参数——都将在 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a> 调用中使用。如果找到了一个对象，<code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> 返回该对象的元组和 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>假设数据库强制执行关键字参数的唯一性（参见 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique</span></code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/options/#django.db.models.Options.unique_together\" title=\"django.db.models.Options.unique_together\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_together</span></code></a>），这个方法是原子性的。如果关键字参数中使用的字段没有唯一性约束，那么对该方法的并发调用可能会导致插入具有相同参数的多条记录。</p>\n</aside>\n<p>你可以通过将 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">filter()</span></code> 串联起来，并使用 <a class=\"reference internal\" href=\"#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Q</span> <span class=\"pre\">对象</span></code></a> 为检索对象指定更复杂的条件。例如，如果 Robert 或 Bob Marley 存在，则检索 Robert 或 Bob Marley，否则创建后者：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Q</span>\n\n<span class=\"n\">obj</span><span class=\"p\">,</span> <span class=\"n\">created</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n    <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Bob&quot;</span><span class=\"p\">)</span> <span class=\"o\">|</span> <span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Robert&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span><span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Marley&quot;</span><span class=\"p\">,</span> <span class=\"n\">defaults</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Bob&quot;</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>如果找到多个对象，<code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> 会引发 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/exceptions/#django.core.exceptions.MultipleObjectsReturned\" title=\"django.core.exceptions.MultipleObjectsReturned\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">MultipleObjectsReturned</span></code></a>。如果没有找到对象，<code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> 将实例化并保存一个新对象，返回一个新对象的元组和 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>。新对象将大致按照以下算法创建：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">params</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"n\">k</span><span class=\"p\">:</span> <span class=\"n\">v</span> <span class=\"k\">for</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">kwargs</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"s2\">&quot;__&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> <span class=\"n\">k</span><span class=\"p\">}</span>\n<span class=\"n\">params</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">({</span><span class=\"n\">k</span><span class=\"p\">:</span> <span class=\"n\">v</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"nb\">callable</span><span class=\"p\">(</span><span class=\"n\">v</span><span class=\"p\">)</span> <span class=\"k\">else</span> <span class=\"n\">v</span> <span class=\"k\">for</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">v</span> <span class=\"ow\">in</span> <span class=\"n\">defaults</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">()})</span>\n<span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">model</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">params</span><span class=\"p\">)</span>\n<span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>在英语中，这意味着从任何不包含双下划线的非 <code class=\"docutils literal notranslate\"><span class=\"pre\">'defaults'</span></code> 关键字参数开始（这将表明一个非精确的查找）。然后添加 <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> 的内容，必要时覆盖任何键，并将结果作为模型类的关键字参数。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> 中存在任何可调用对象，则对其进行评估。正如上面所提示的，这是对所使用算法的简化，但它包含了所有相关的细节。内部实现有比这更多的错误检查，并处理一些额外的边缘条件；如果你感兴趣，请阅读代码。</p>\n<p>如果你有一个名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> 的字段，并且想在 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> 中使用它作为精确查询，使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">'defaults__exact'</span></code>，像这样：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Foo</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span><span class=\"n\">defaults__exact</span><span class=\"o\">=</span><span class=\"s2\">&quot;bar&quot;</span><span class=\"p\">,</span> <span class=\"n\">defaults</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;defaults&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;baz&quot;</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>当你使用手动指定的主键时，<code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> 方法的错误行为与 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.create\" title=\"django.db.models.query.QuerySet.create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">create()</span></code></a> 类似。如果需要创建一个对象，而该键已经存在于数据库中，则会引发一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code></a>。</p>\n<p>最后，关于在 Django 视图中使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code> 的一些建议。请确保只在 <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> 请求中使用它，除非你有充分的理由不这样做。<code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> 请求不应该对数据产生任何影响。相反，只有当对页面的请求对数据产生副作用时，才使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>。有关更多信息，请参阅 HTTP 规范中的 <span class=\"target\" id=\"index-6\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-9.2.1\"><strong>Safe methods</strong></a>。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>你可以通过 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> 属性和反向关系来使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code>。在这种情况下，你将限制在该关系的上下文内进行查询。如果你不持续使用它，这可能会导致一些完整性问题。</p>\n<p>如以下模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Chapter</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">255</span><span class=\"p\">,</span> <span class=\"n\">unique</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Book</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">256</span><span class=\"p\">)</span>\n    <span class=\"n\">chapters</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Chapter</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>你可以通过 Book 的 chapters 字段使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code>，但它只在该书的上下文中获取：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">book</span> <span class=\"o\">=</span> <span class=\"n\">Book</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Ulysses&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">book</span><span class=\"o\">.</span><span class=\"n\">chapters</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Telemachus&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">(&lt;Chapter: Telemachus&gt;, True)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">book</span><span class=\"o\">.</span><span class=\"n\">chapters</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Telemachus&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">(&lt;Chapter: Telemachus&gt;, False)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Chapter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Chapter 1&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Chapter: Chapter 1&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">book</span><span class=\"o\">.</span><span class=\"n\">chapters</span><span class=\"o\">.</span><span class=\"n\">get_or_create</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Chapter 1&quot;</span><span class=\"p\">)</span>\n<span class=\"go\"># Raises IntegrityError</span>\n</code></pre></div>\n<p>出现这种情况是因为它试图通过“Ulysses”这本书获取或创建“Chapter 1”，但它不能做任何事情：关系不能获取该章，因为它与该书无关，但它也不能创建它，因为 <code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code> 字段应该是唯一的。</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">aget_or_create()</span></code> 方法已添加。</p>\n</aside>\n</section>\n<section id=\"update-or-create\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">update_or_create()</span></code><a class=\"heading-anchor\" href=\"#update-or-create\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.update_or_create\">\n<span class=\"sig-name descname\"><span class=\"pre\">update_or_create</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">defaults</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.update_or_create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aupdate_or_create\">\n<span class=\"sig-name descname\"><span class=\"pre\">aupdate_or_create</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">defaults</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aupdate_or_create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aupdate_or_create()</span></code></p>\n<p>用给定的 <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> 更新对象的一种方便方法，是必要时创建一个新对象。<code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> 是用来更新对象的 (field, value) 对的字典。<code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> 中的值可以是可调用对象。</p>\n<p>返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">(object,</span> <span class=\"pre\">created)</span></code> 的元组，其中 <code class=\"docutils literal notranslate\"><span class=\"pre\">object</span></code> 是创建或更新的对象，<code class=\"docutils literal notranslate\"><span class=\"pre\">created</span></code> 是一个布尔值，指定是否创建了一个新对象。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">update_or_create</span></code> 方法根据给定的 <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> 尝试从数据库中获取一个对象。如果找到了匹配的对象，它就会更新 <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> 字典中传递的字段。</p>\n<p>这是作为一个快捷方式来处理样板代码。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">defaults</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Bob&quot;</span><span class=\"p\">}</span>\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span> <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> <span class=\"n\">key</span><span class=\"p\">,</span> <span class=\"n\">value</span> <span class=\"ow\">in</span> <span class=\"n\">defaults</span><span class=\"o\">.</span><span class=\"n\">items</span><span class=\"p\">():</span>\n        <span class=\"nb\">setattr</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">,</span> <span class=\"n\">key</span><span class=\"p\">,</span> <span class=\"n\">value</span><span class=\"p\">)</span>\n    <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"k\">except</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><span class=\"p\">:</span>\n    <span class=\"n\">new_values</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">}</span>\n    <span class=\"n\">new_values</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">defaults</span><span class=\"p\">)</span>\n    <span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">new_values</span><span class=\"p\">)</span>\n    <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>当模型中的字段数量增加时，这种模式就会变得很笨重。上面的例子可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_or_create()</span></code> 重写，就像这样：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">obj</span><span class=\"p\">,</span> <span class=\"n\">created</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">update_or_create</span><span class=\"p\">(</span>\n    <span class=\"n\">first_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;John&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">last_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">defaults</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Bob&quot;</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>关于如何解决在 <code class=\"docutils literal notranslate\"><span class=\"pre\">kwargs</span></code> 中传递名字的详细描述，见 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get_or_create\" title=\"django.db.models.query.QuerySet.get_or_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code></a>。</p>\n<p>如上文 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get_or_create\" title=\"django.db.models.query.QuerySet.get_or_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code></a> 中所述，这种方法容易出现竞争条件，如果不在数据库层面强制执行唯一性，就会导致同时插入多条记录。</p>\n<p>就像 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get_or_create\" title=\"django.db.models.query.QuerySet.get_or_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code></a> 和 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.create\" title=\"django.db.models.query.QuerySet.create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">create()</span></code></a> 一样，如果你使用的是手动指定的主键，需要创建一个对象，但该键已经存在于数据库中，就会引发 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code></a>。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">aupdate_or_create()</span></code> 方法已添加。</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"4.2\">\n<p class=\"version-note-title\">Changed in Django 4.2</p><p>在早期版本中，调用 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.save()</span></code></a> 时，<code class=\"docutils literal notranslate\"><span class=\"pre\">update_or_create()</span></code> 没有指定 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code>。</p>\n</aside>\n</section>\n<section id=\"bulk-create\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">bulk_create()</span></code><a class=\"heading-anchor\" href=\"#bulk-create\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.bulk_create\">\n<span class=\"sig-name descname\"><span class=\"pre\">bulk_create</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">objs</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">batch_size</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">ignore_conflicts</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">update_conflicts</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">update_fields</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">unique_fields</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.bulk_create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.abulk_create\">\n<span class=\"sig-name descname\"><span class=\"pre\">abulk_create</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">objs</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">batch_size</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">ignore_conflicts</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">update_conflicts</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">update_fields</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">unique_fields</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.abulk_create\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">abulk_create()</span></code></p>\n<p>这个方法以高效的方式将提供的对象列表插入数据库中（通常只有 1 个查询，无论有多少对象），并以与提供的顺序相同的顺序返回已创建的对象列表：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">objs</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">bulk_create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"p\">[</span>\n<span class=\"gp\">... </span>        <span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;This is a test&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>        <span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;This is only a test&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">]</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>不过这有一些注意事项：</p>\n<ul>\n<li><p>模型的 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 方法将不会被调用，<code class=\"docutils literal notranslate\"><span class=\"pre\">pre_save</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">post_save</span></code> 信号将不会被发送。</p></li>\n<li><p>在多表继承的情况下，它不能与子模型一起工作。</p></li>\n<li><p>如果模型的主键是一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a>，主键属性只能在某些数据库（目前是 PostgreSQL，MariaDB 10.5+，和 SQLite 3.35+）上检索到。在其他数据库中，它将不会被设置。</p></li>\n<li><p>对于多对多的关系，它是行不通的。</p></li>\n<li><p>它将 <code class=\"docutils literal notranslate\"><span class=\"pre\">objs</span></code> 转换为一个列表，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">objs</span></code> 是一个生成器，则完全执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">objs</span></code>。这种转换允许检查所有对象，因此任何具有手动设置主键的对象都可以首先插入。如果你想分批插入对象，而不一次性执行整个生成器，你可以使用这种技术，只要对象没有任何手动设置的主键：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">itertools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">islice</span>\n\n<span class=\"n\">batch_size</span> <span class=\"o\">=</span> <span class=\"mi\">100</span>\n<span class=\"n\">objs</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;Test </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">i</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"mi\">1000</span><span class=\"p\">))</span>\n<span class=\"k\">while</span> <span class=\"kc\">True</span><span class=\"p\">:</span>\n    <span class=\"n\">batch</span> <span class=\"o\">=</span> <span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">islice</span><span class=\"p\">(</span><span class=\"n\">objs</span><span class=\"p\">,</span> <span class=\"n\">batch_size</span><span class=\"p\">))</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">batch</span><span class=\"p\">:</span>\n        <span class=\"k\">break</span>\n    <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">bulk_create</span><span class=\"p\">(</span><span class=\"n\">batch</span><span class=\"p\">,</span> <span class=\"n\">batch_size</span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">batch_size</span></code> 参数控制在一次查询中创建多少对象。默认情况是在一个批次中创建所有对象，但 SQLite 除外，默认情况是每个查询最多使用 999 个变量。</p>\n<p>在支持的数据库上（除了 Oracle），将 <code class=\"docutils literal notranslate\"><span class=\"pre\">ignore_conflicts</span></code> 参数设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 告诉数据库忽略插入失败的行，例如违反唯一值约束的行。</p>\n<p>在支持的数据库上（除了 Oracle 和 SQLite &lt; 3.24），将 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_conflicts</span></code> 参数设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，告诉数据库在发生冲突时更新 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code>。在 PostgreSQL 和 SQLite 上，除了 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code>，还必须提供可能发生冲突的 <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_fields</span></code> 列表。</p>\n<p>启用 <code class=\"docutils literal notranslate\"><span class=\"pre\">ignore_conflicts</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">update_conflicts</span></code> 参数会禁用在每个模型实例上设置主键（如果数据库通常支持的话）。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>在 MySQL 和 MariaDB 上，将 <code class=\"docutils literal notranslate\"><span class=\"pre\">ignore_conflicts</span></code> 参数设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 将某些类型的错误，除了重复键之外，变成警告。即使在严格模式下也是如此。例如：无效值或不可空值违规。更多细节请参见 <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/sql-mode.html#ignore-strict-comparison\">MySQL documentation</a> 和 <a class=\"reference external\" href=\"https://mariadb.com/kb/en/ignore/\">MariaDB documentation</a> 。</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">update_conflicts</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">update_fields</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">unique_fields</span></code> 参数已添加，以支持在发生冲突时更新字段。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">abulk_create()</span></code> 方法已添加。</p>\n</aside>\n</section>\n<section id=\"bulk-update\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">bulk_update()</span></code><a class=\"heading-anchor\" href=\"#bulk-update\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.bulk_update\">\n<span class=\"sig-name descname\"><span class=\"pre\">bulk_update</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">objs</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fields</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">batch_size</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.bulk_update\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.abulk_update\">\n<span class=\"sig-name descname\"><span class=\"pre\">abulk_update</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">objs</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fields</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">batch_size</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.abulk_update\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">abulk_update()</span></code></p>\n<p>这个方法高效地更新提供的模型实例上的给定字段，通常只需一个查询，并返回更新的对象数量：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">objs</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;Entry 1&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;Entry 2&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">objs</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;This is entry 1&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">objs</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;This is entry 2&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">bulk_update</span><span class=\"p\">(</span><span class=\"n\">objs</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">])</span>\n<span class=\"go\">2</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.update\" title=\"django.db.models.query.QuerySet.update\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.update()</span></code></a> 用于保存更改，所以这比遍历模型列表并对每个模型调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 更有效，但它有一些注意事项：</p>\n<ul class=\"simple\">\n<li><p>你不能更新模型的主键。</p></li>\n<li><p>每个模型的 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 方法没有被调用，而且 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/signals/#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">pre_save</span></code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/signals/#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">post_save</span></code></a> 信号没有被发送。</p></li>\n<li><p>如果更新大量行中的大量列，生成的 SQL 可能非常大。通过指定一个合适的 <code class=\"docutils literal notranslate\"><span class=\"pre\">batch_size</span></code> 来避免这种情况。</p></li>\n<li><p>更新定义在多表继承祖先上的字段将给每个祖先带来额外的查询。</p></li>\n<li><p>当一个单独的批次包含重复的内容时，只有该批次的第一个实例会导致更新。</p></li>\n<li><p>该函数返回的更新对象的数量可能少于传入的对象的数量。这可能是由于传入的对象重复，在同一批次中被更新，或者是竞赛条件，如对象在数据库中不再存在。</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">batch_size</span></code> 参数控制一次查询中保存多少对象。默认值是在一个批次中更新所有对象，但 SQLite 和 Oracle 除外，它们对查询中使用的变量数量有限制。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">abulk_update()</span></code> 方法已添加。</p>\n</aside>\n</section>\n<section id=\"count\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code><a class=\"heading-anchor\" href=\"#count\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.count\">\n<span class=\"sig-name descname\"><span class=\"pre\">count</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.count\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.acount\">\n<span class=\"sig-name descname\"><span class=\"pre\">acount</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.acount\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">acount()</span></code></p>\n<p>返回一个整数，表示数据库中与 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 匹配的对象数量。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Returns the total number of entries in the database.</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Returns the number of entries whose headline contains &#39;Lennon&#39;</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__contains</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> 调用在幕后执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">COUNT(*)</span></code>，所以你应该总是使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> 而不是将所有的记录加载到 Python 对象中，然后在结果上调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">len()</span></code> （除非你需要将对象加载到内存中，在这种情况下 <code class=\"docutils literal notranslate\"><span class=\"pre\">len()</span></code> 会更快）。</p>\n<p>请注意，如果你想知道 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中的项数，并且也要从它中检索模型实例（例如，通过迭代它），那么使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">len(queryset)</span></code> 可能更有效，因为它不会像 <code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> 那样引起额外的数据库查询。</p>\n<p>如果查询集已经被完全检索到，<code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> 将使用该长度，而不是执行额外的数据库查询。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">acount()</span></code> 方法已添加。</p>\n</aside>\n</section>\n<section id=\"in-bulk\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">in_bulk()</span></code><a class=\"heading-anchor\" href=\"#in-bulk\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.in_bulk\">\n<span class=\"sig-name descname\"><span class=\"pre\">in_bulk</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">id_list</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'pk'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.in_bulk\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.ain_bulk\">\n<span class=\"sig-name descname\"><span class=\"pre\">ain_bulk</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">id_list</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'pk'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.ain_bulk\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">ain_bulk()</span></code></p>\n<p>接收一个字段值的列表（<code class=\"docutils literal notranslate\"><span class=\"pre\">id_list</span></code>）和这些值的 <code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span></code>，并返回一个字典，将每个值映射到具有给定字段值的对象实例。<code class=\"docutils literal notranslate\"><span class=\"pre\">in_bulk</span></code> 不会引发任何 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/exceptions/#django.core.exceptions.ObjectDoesNotExist\" title=\"django.core.exceptions.ObjectDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">django.core.exceptions.ObjectDoesNotExist</span></code></a> 异常；也就是说，任何不匹配任何实例的 <code class=\"docutils literal notranslate\"><span class=\"pre\">id_list</span></code> 值将被简单地忽略掉。如果没有提供 <code class=\"docutils literal notranslate\"><span class=\"pre\">id_list</span></code>，将返回查询集的所有对象。<code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span></code> 必须是一个唯一字段或一个独立的字段（如果只有一个字段在 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.distinct\" title=\"django.db.models.query.QuerySet.distinct\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">distinct()</span></code></a> 中指定）。<code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span></code> 默认为主键。</p>\n<p>例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">([</span><span class=\"mi\">1</span><span class=\"p\">])</span>\n<span class=\"go\">{1: &lt;Blog: Beatles Blog&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">([</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">])</span>\n<span class=\"go\">{1: &lt;Blog: Beatles Blog&gt;, 2: &lt;Blog: Cheddar Talk&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">([])</span>\n<span class=\"go\">{}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">()</span>\n<span class=\"go\">{1: &lt;Blog: Beatles Blog&gt;, 2: &lt;Blog: Cheddar Talk&gt;, 3: &lt;Blog: Django Weblog&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">([</span><span class=\"s2\">&quot;beatles_blog&quot;</span><span class=\"p\">],</span> <span class=\"n\">field_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">{&#39;beatles_blog&#39;: &lt;Blog: Beatles Blog&gt;}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">in_bulk</span><span class=\"p\">(</span><span class=\"n\">field_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">{&#39;Beatles Blog&#39;: &lt;Blog: Beatles Blog&gt;, &#39;Cheddar Talk&#39;: &lt;Blog: Cheddar Talk&gt;, &#39;Django Weblog&#39;: &lt;Blog: Django Weblog&gt;}</span>\n</code></pre></div>\n<p>如果你传递 <code class=\"docutils literal notranslate\"><span class=\"pre\">in_bulk()</span></code> 一个空列表，你将得到一个空字典。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ain_bulk()</span></code> 方法已添加。</p>\n</aside>\n</section>\n<section id=\"iterator\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code><a class=\"heading-anchor\" href=\"#iterator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.iterator\">\n<span class=\"sig-name descname\"><span class=\"pre\">iterator</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">chunk_size</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.iterator\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aiterator\">\n<span class=\"sig-name descname\"><span class=\"pre\">aiterator</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">chunk_size</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aiterator\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aiterator()</span></code></p>\n<p>评估 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> （通过执行查询）并返回结果的迭代器，如果调用其异步版本 <code class=\"docutils literal notranslate\"><span class=\"pre\">aiterator</span></code>，则返回异步迭代器。</p>\n<p>通常，<code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 会在内部缓存其结果，以便重复评估不会导致额外的查询。相比之下，<code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code> 将直接读取结果，而不会在 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 级别进行任何缓存（在内部，默认迭代器调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code> 并缓存返回值）。对于返回大量对象且您只需访问一次的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>，这可以提高性能并显著减少内存使用。</p>\n<p>请注意，在已经被执行的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 上使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code> 会迫使它再次执行，重复查询。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code> 与之前对 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code> 的调用兼容，只要提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">chunk_size</span></code>。较大的值将需要更少的查询来完成预取操作，但代价是更多的内存使用。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">aiterator()</span></code> 与之前对 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code> 的调用不兼容。</p>\n</aside>\n<p>在某些数据库（例如 Oracle，SQLite）中，SQL 中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">IN</span></code> 子句中的最大项数可能会受到限制。因此，应使用低于此限制的值。特别是在跨两个或多个关系进行预取的情况下，<code class=\"docutils literal notranslate\"><span class=\"pre\">chunk_size</span></code> 应该足够小，以便每个预取关系的预期结果数量仍然保持在限制以下。</p>\n<p>只要 QuerySet 不预取任何相关对象，不为 <code class=\"docutils literal notranslate\"><span class=\"pre\">chunk_size</span></code> 提供值，Django 将使用默认的隐式值 2000。</p>\n<p>根据数据库后端，查询结果将被一次性加载或使用服务器端的游标从数据库中流转。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code> 方法现在支持预取相关对象。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">aiterator()</span></code> 方法已添加。</p>\n</aside>\n<aside class=\"version-note version-deprecated\" data-version=\"4.1\">\n<p class=\"version-note-title\">Deprecated since Django 4.1</p><p><span class=\"versionmodified deprecated\">Deprecated since version 4.1: </span>在不提供 <code class=\"docutils literal notranslate\"><span class=\"pre\">chunk_size</span></code> 的情况下对预取相关对象的查询集使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code> 已经被弃用。在 Django 5.0 中将会引发异常。</p>\n</aside>\n<section id=\"with-server-side-cursors\">\n<h5>使用服务器端游标<a class=\"heading-anchor\" href=\"#with-server-side-cursors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>Oracle 和 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/databases/#postgresql-server-side-cursors\"><span class=\"std std-ref\">PostgreSQL</span></a> 使用服务器端的游标从数据库流式传输结果，而不需要将整个结果集加载到内存中。</p>\n<p>Oracle 数据库驱动程序总是使用服务器端的游标。</p>\n<p>对于服务器端的游标，<code class=\"docutils literal notranslate\"><span class=\"pre\">chunk_size</span></code> 参数指定了要在数据库驱动层缓存的结果数量。获取更大的块数会减少数据库驱动和数据库之间的往返次数，但会牺牲内存。</p>\n<p>在 PostgreSQL 上，只有当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-DATABASE-DISABLE_SERVER_SIDE_CURSORS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DISABLE_SERVER_SIDE_CURSORS</span></code></a> 设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 时，才会使用服务器端游标。如果你使用的是配置在事务池模式下的连接池器，请阅读 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/databases/#transaction-pooling-server-side-cursors\"><span class=\"std std-ref\">事务池和服务器端游标</span></a>。当禁用服务器端游标时，其行为与不支持服务器端游标的数据库相同。</p>\n</section>\n<section id=\"without-server-side-cursors\">\n<h5>没有服务器端游标<a class=\"heading-anchor\" href=\"#without-server-side-cursors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>MySQL 不支持流式结果，因此 Python 数据库驱动将整个结果集加载到内存中。然后数据库适配器使用 <span class=\"target\" id=\"index-7\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/\"><strong>PEP 249</strong></a> 中定义的 <code class=\"docutils literal notranslate\"><span class=\"pre\">fetchmany()</span></code> 方法将结果集转化为 Python 行对象。</p>\n<p>SQLite 可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">fetchmany()</span></code> 分批获取结果，但由于 SQLite 不提供连接内查询之间的隔离，所以在向被迭代的表写入时要小心。参见 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/databases/#sqlite-isolation\"><span class=\"std std-ref\">使用 QuerySet.iterator() 时的隔离</span></a> 了解更多信息。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">chunk_size</span></code> 参数控制 Django 从数据库驱动中获取的批次大小。批量越大，就会减少与数据库驱动通信的开销，但代价是略微增加内存消耗。</p>\n<p>只要查询集不预取任何相关对象，不提供 <code class=\"docutils literal notranslate\"><span class=\"pre\">chunk_size</span></code> 的值将导致 Django 使用隐式默认值 2000，这个值是从 <a class=\"reference external\" href=\"https://www.postgresql.org/message-id/4D2F2C71.8080805%40dndg.it\">psycopg 邮件列表上的计算</a> 推导出的。</p>\n<blockquote>\n<div><p>假设行数为 10-20 列，文字数据和数字数据混合，2000 要取不到 100KB 的数据，这似乎是一个很好的折中方案，在传输的行数和提前退出循环时丢弃的数据之间。</p>\n</div></blockquote>\n</section>\n</section>\n<section id=\"latest\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code><a class=\"heading-anchor\" href=\"#latest\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.latest\">\n<span class=\"sig-name descname\"><span class=\"pre\">latest</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.latest\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.alatest\">\n<span class=\"sig-name descname\"><span class=\"pre\">alatest</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.alatest\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">alatest()</span></code></p>\n<p>根据给定的字段，返回表中最新的对象。</p>\n<p>这个例子根据 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 字段返回表中最新的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">latest</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>你也可以根据几个字段选择最新的。例如，当两个条目具有相同的 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 时，要选择最早的 <code class=\"docutils literal notranslate\"><span class=\"pre\">expire_date</span></code> 条目：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">latest</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;-expire_date&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">'-expire_date'</span></code> 中的负号表示按 <em>降</em> 序排列 <code class=\"docutils literal notranslate\"><span class=\"pre\">expire_date</span></code>。由于 <code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code> 得到的是最后一个结果，所以选择了最早的 <code class=\"docutils literal notranslate\"><span class=\"pre\">expire_date</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code>。</p>\n<p>如果你模型的 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/models/#meta-options\"><span class=\"std std-ref\">Meta</span></a> 指定了 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/options/#django.db.models.Options.get_latest_by\" title=\"django.db.models.Options.get_latest_by\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">get_latest_by</span></code></a>，你可以省略 <code class=\"docutils literal notranslate\"><span class=\"pre\">earliest()</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code> 的任何参数。<a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/options/#django.db.models.Options.get_latest_by\" title=\"django.db.models.Options.get_latest_by\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">get_latest_by</span></code></a> 中指定的字段将被默认使用。</p>\n<p>像 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a>、<code class=\"docutils literal notranslate\"><span class=\"pre\">earliest()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code>，如果没有给定参数的对象，就会引发 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/class/#django.db.models.Model.DoesNotExist\" title=\"django.db.models.Model.DoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">DoesNotExist</span></code></a>。</p>\n<p>请注意，<code class=\"docutils literal notranslate\"><span class=\"pre\">earliest()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code> 的存在纯粹是为了方便和可读性。</p>\n<aside class=\"admonition-earliest-and-latest-may-return-instances-with-null-dates admonition\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\"><span class=\"pre\">earliest()</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">latest()</span></code> 可能返回日期为空的实例。</p>\n<p>由于排序是委托给数据库的，如果使用不同的数据库，允许空值的字段上的结果可能会有不同的排序。例如，PostgreSQL 和 MySQL 将空值排序为高于非空值，而 SQLite 则相反。</p>\n<p>你可能想过滤掉空值：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__isnull</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">latest</span><span class=\"p\">(</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>已添加了 <code class=\"docutils literal notranslate\"><span class=\"pre\">alatest()</span></code> 方法。</p>\n</aside>\n</section>\n<section id=\"earliest\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">earliest()</span></code><a class=\"heading-anchor\" href=\"#earliest\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.earliest\">\n<span class=\"sig-name descname\"><span class=\"pre\">earliest</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.earliest\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aearliest\">\n<span class=\"sig-name descname\"><span class=\"pre\">aearliest</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">fields</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aearliest\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aearliest()</span></code></p>\n<p>除了方向改变外，其他工作方式都像 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.last\" title=\"django.db.models.query.QuerySet.last\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">last()</span></code></a>。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>已添加了 <code class=\"docutils literal notranslate\"><span class=\"pre\">aearliest()</span></code> 方法。</p>\n</aside>\n</section>\n<section id=\"first\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">first()</span></code><a class=\"heading-anchor\" href=\"#first\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.first\">\n<span class=\"sig-name descname\"><span class=\"pre\">first</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.first\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.afirst\">\n<span class=\"sig-name descname\"><span class=\"pre\">afirst</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.afirst\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">afirst()</span></code></p>\n<p>返回查询集匹配的第一个对象，如果没有匹配的对象，则返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 没有定义排序，那么查询集自动按主键排序。这可能会影响聚合结果，如 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/aggregation/#aggregation-ordering-interaction\"><span class=\"std std-ref\">Interaction with order_by()</span></a> 中所述。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">first</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>请注意，<code class=\"docutils literal notranslate\"><span class=\"pre\">first()</span></code> 是一个方便的方法，下面的代码示例相当于上面的例子：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"k\">except</span> <span class=\"ne\">IndexError</span><span class=\"p\">:</span>\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>已添加了 <code class=\"docutils literal notranslate\"><span class=\"pre\">afirst()</span></code> 方法。</p>\n</aside>\n</section>\n<section id=\"last\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">last()</span></code><a class=\"heading-anchor\" href=\"#last\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.last\">\n<span class=\"sig-name descname\"><span class=\"pre\">last</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.last\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.alast\">\n<span class=\"sig-name descname\"><span class=\"pre\">alast</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.alast\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">alast()</span></code></p>\n<p>与 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.first\" title=\"django.db.models.query.QuerySet.first\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">first()</span></code></a> 工作原理相同，但返回的是查询集中的最后一个对象。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>已添加了 <code class=\"docutils literal notranslate\"><span class=\"pre\">alast()</span></code> 方法。</p>\n</aside>\n</section>\n<section id=\"aggregate\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code><a class=\"heading-anchor\" href=\"#aggregate\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aggregate\">\n<span class=\"sig-name descname\"><span class=\"pre\">aggregate</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aggregate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aaggregate\">\n<span class=\"sig-name descname\"><span class=\"pre\">aaggregate</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">args</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aaggregate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aaggregate()</span></code></p>\n<p>返回对 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 计算的聚合值（平均值、总和等）的字典。<code class=\"docutils literal notranslate\"><span class=\"pre\">aggregate()</span></code> 的每个参数都指定了一个将被包含在返回的字典中的值。</p>\n<p>Django 提供的聚合函数在下面的 <a class=\"reference internal\" href=\"#id6\">Aggregation Functions</a> 中介绍。由于聚合函数也是 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/expressions/\"><span class=\"doc\">查询表达式</span></a>，所以你可以将聚合函数与其他聚合函数或值结合起来，创建复杂的聚合函数。</p>\n<p>使用关键字参数指定的聚合将使用关键字作为注解的名称。匿名参数将根据聚合函数的名称和被聚合的模型字段为其生成一个名称。复杂的聚合不能使用匿名参数，必须指定一个关键字参数作为别名。</p>\n<p>例如，当你处理博客条目时，你可能想要知道有多少位作者贡献了博客条目：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Count</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;entry__count&#39;: 16}</span>\n</code></pre></div>\n<p>通过使用关键字参数来指定聚合函数，你可以控制返回的聚合值的名称：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">number_of_entries</span><span class=\"o\">=</span><span class=\"n\">Count</span><span class=\"p\">(</span><span class=\"s2\">&quot;entry&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">{&#39;number_of_entries&#39;: 16}</span>\n</code></pre></div>\n<p>关于聚合的深入讨论，见 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/aggregation/\"><span class=\"doc\">关于聚合的专题指南</span></a>。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>已添加了 <code class=\"docutils literal notranslate\"><span class=\"pre\">aaggregate()</span></code> 方法。</p>\n</aside>\n</section>\n<section id=\"exists\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">exists()</span></code><a class=\"heading-anchor\" href=\"#exists\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.exists\">\n<span class=\"sig-name descname\"><span class=\"pre\">exists</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.exists\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aexists\">\n<span class=\"sig-name descname\"><span class=\"pre\">aexists</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aexists\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aexists()</span></code></p>\n<p>如果 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 包含任何结果，则返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，如果不包含，则返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>。该函数试图以最简单、最快速的方式执行查询，但它 <em>执行</em> 的查询与普通的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 查询几乎相同。</p>\n<p><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">existence()</span></code> 对于与 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 中任何对象的存在有关的搜索很有用，特别是在一个大的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 的背景下。</p>\n<p>要查找一个查询集是否包含任何项目：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">some_queryset</span><span class=\"o\">.</span><span class=\"n\">exists</span><span class=\"p\">():</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;There is at least one object in some_queryset&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这种方法比下面的方法更快：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">some_queryset</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;There is at least one object in some_queryset&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>...但程度不高（因此需要大量的查询集才能获得效率提升）。</p>\n<p>此外，如果一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">some_queryset</span></code> 还没有被执行，但你知道它会在某个时候被执行，那么使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">some_queryset.exences()</span></code> 比使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">bool(some_queryset)</span></code> 会做更多的总体工作（一个存在性检查的查询加上一个额外的查询，以便以后检索结果），后者检索结果，然后检查是否有任何返回。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>已添加了 <code class=\"docutils literal notranslate\"><span class=\"pre\">aexists()</span></code> 方法。</p>\n</aside>\n</section>\n<section id=\"contains\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">contains()</span></code><a class=\"heading-anchor\" href=\"#contains\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.contains\">\n<span class=\"sig-name descname\"><span class=\"pre\">contains</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">obj</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.contains\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.acontains\">\n<span class=\"sig-name descname\"><span class=\"pre\">acontains</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">obj</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.acontains\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">acontains()</span></code></p>\n<p>如果 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code>，返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，如果不包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>。这试图以最简单和最快的方式执行查询。</p>\n<p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.contains\" title=\"django.db.models.query.QuerySet.contains\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">contains()</span></code></a> 对于检查一个对象在 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 中的成员资格很有用，特别是在一个大的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 的情况下。</p>\n<p>要检查一个查询集是否包含一个特定的项目：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">some_queryset</span><span class=\"o\">.</span><span class=\"n\">contains</span><span class=\"p\">(</span><span class=\"n\">obj</span><span class=\"p\">):</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Entry contained in queryset&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这将比以下需要执行和迭代整个查询集的方法更快：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">obj</span> <span class=\"ow\">in</span> <span class=\"n\">some_queryset</span><span class=\"p\">:</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Entry contained in queryset&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>像 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exists\" title=\"django.db.models.query.QuerySet.exists\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exists()</span></code></a> 一样，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">some_queryset</span></code> 还没有被执行，但你知道它将在某个时候被执行，那么使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">some_queryset.contains(obj)</span></code> 将进行额外的数据库查询，通常会导致整体性能变慢。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">acontains()</span></code> 方法已添加。</p>\n</aside>\n</section>\n<section id=\"update\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code><a class=\"heading-anchor\" href=\"#update\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.update\">\n<span class=\"sig-name descname\"><span class=\"pre\">update</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.update\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aupdate\">\n<span class=\"sig-name descname\"><span class=\"pre\">aupdate</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aupdate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aupdate()</span></code></p>\n<p>对指定的字段执行 SQL 更新查询，并返回匹配的行数（如果有些行已经有了新的值，则可能不等于更新的行数）。</p>\n<p>例如，要关闭所有在 2010 年发布的博客条目的评论，你可以这样做：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（假定你的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> 模型有 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">comments_on</span></code>。）</p>\n<p>你可以更新多个字段，没有限制。例如，这里我们更新了 <code class=\"docutils literal notranslate\"><span class=\"pre\">comments_on</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> 字段：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;This is old&quot;</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> 方法会立即应用，并且被更新的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 的唯一限制是它只能更新模型主表中的列，不能更新相关模型上的列。例如，你不能这样做：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">blog__name</span><span class=\"o\">=</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># Won&#39;t work!</span>\n</code></pre></div>\n<p>基于相关字段的过滤仍然是可能的：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog__id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>你不能在一个 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 上调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code>，因为它已经被取走了一个片断或者不能再被过滤。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> 方法返回受影响的行数：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">64</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">1</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">slug</span><span class=\"o\">=</span><span class=\"s2\">&quot;nonexistent-slug&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"go\">0</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"go\">132</span>\n</code></pre></div>\n<p>如果你只是更新一条记录，不需要对模型对象做任何事情，最有效的方法是调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code>，而不是将模型对象加载到内存中。例如，不要这样做：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n<span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">comments_on</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n<span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>...要这样做：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">comments_on</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> 还可以防止在加载对象和调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 之间的短暂时间内数据库中的某些东西可能发生变化的竞争条件。</p>\n<p>最后，要知道，<code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> 是在 SQL 级别上进行更新，因此，它不会在模型上调用任何 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> 方法，也不会发出 <code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">pre_save</span></code> 或 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/signals/#django.db.models.signals.post_save\" title=\"django.db.models.signals.post_save\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">post_save</span></code></a> 信号（这是调用 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Model.save()</span></code></a> 的结果）。如果你想为一个有自定义 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a> 方法的模型更新一堆记录，在它们上面循环并调用 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">save()</span></code></a>，像这样：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2010</span><span class=\"p\">):</span>\n    <span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">comments_on</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    <span class=\"n\">e</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>已添加了 <code class=\"docutils literal notranslate\"><span class=\"pre\">aupdate()</span></code> 方法。</p>\n</aside>\n<section id=\"ordered-queryset\">\n<h5>有序的查询集<a class=\"heading-anchor\" href=\"#ordered-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>将 <code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> 与 <code class=\"docutils literal notranslate\"><span class=\"pre\">update()</span></code> 串联起来，只在 MariaDB 和 MySQL 上支持，对于不同的数据库会被忽略。这对于按照指定的顺序更新一个唯一的字段是很有用的，没有冲突。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s2\">&quot;-number&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">number</span><span class=\"o\">=</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;number&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">order_by()</span></code> 子句如果包含注释、继承字段或跨越关系的查找，将被忽略。</p>\n</aside>\n</section>\n</section>\n<section id=\"delete\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code><a class=\"heading-anchor\" href=\"#delete\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.delete\">\n<span class=\"sig-name descname\"><span class=\"pre\">delete</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.delete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.adelete\">\n<span class=\"sig-name descname\"><span class=\"pre\">adelete</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.adelete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">adelete()</span></code></p>\n<p>对 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 中的所有行执行 SQL 删除查询，并返回删除的对象数量和每个对象类型的删除数量的字典。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> 是即时应用的。你不能对已经被取走一个片断或不能再被过滤的 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> 调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code>。</p>\n<p>例如，要删除特定博客中的所有条目：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Delete all the entries belonging to this Blog.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog</span><span class=\"o\">=</span><span class=\"n\">b</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n<span class=\"go\">(4, {&#39;blog.Entry&#39;: 2, &#39;blog.Entry_authors&#39;: 2})</span>\n</code></pre></div>\n<p>默认情况下，Django 的 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 模拟了 SQL 约束 <code class=\"docutils literal notranslate\"><span class=\"pre\">ON</span> <span class=\"pre\">DELETE</span> <span class=\"pre\">CASCADE</span></code> — 也就是说，任何具有外键指向将要被删除的对象的对象将会随之一起被删除。例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">blogs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n\n<span class=\"go\"># This will delete all Blogs and all of their Entry objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">blogs</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n<span class=\"go\">(5, {&#39;blog.Blog&#39;: 1, &#39;blog.Entry&#39;: 2, &#39;blog.Entry_authors&#39;: 2})</span>\n</code></pre></div>\n<p>这种级联行为通过 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> 的 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">on_delete</span></code></a> 参数定义。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> 方法进行批量删除，并不调用模型上的任何 <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> 方法。但是，它确实为所有被删除的对象（包括级联删除）发出 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/signals/#django.db.models.signals.pre_delete\" title=\"django.db.models.signals.pre_delete\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">pre_delete</span></code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/signals/#django.db.models.signals.post_delete\" title=\"django.db.models.signals.post_delete\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_delete</span></code></a> 信号。</p>\n<p>Django 需要将对象获取到内存中来发送信号和处理级联。但是，如果没有级联和信号，那么 Django 可能会采取快速路径删除对象，而不需要将其获取到内存中。对于大面积的删除，这可以使内存使用量大大降低。也可以减少执行查询的数量。</p>\n<p>设置为 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/#django.db.models.ForeignKey.on_delete\" title=\"django.db.models.ForeignKey.on_delete\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">on_delete</span></code></a> <code class=\"docutils literal notranslate\"><span class=\"pre\">DO_NOTHING</span></code> 的外键不会阻止在删除时采取快速路径。</p>\n<p>需要注意的是，对象删除中产生的查询是一个实现细节，可能会发生变化。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>已添加了 <code class=\"docutils literal notranslate\"><span class=\"pre\">adelete()</span></code> 方法。</p>\n</aside>\n</section>\n<section id=\"as-manager\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">as_manager()</span></code><a class=\"heading-anchor\" href=\"#as-manager\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.as_manager\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">as_manager</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.as_manager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>类方法，该方法返回一个 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Manager</span></code></a> 的实例，其中包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的方法的副本。详见 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/managers/#create-manager-with-queryset-methods\"><span class=\"std std-ref\">创建带有 QuerySet 方法的管理器</span></a> 。</p>\n<p>请注意，与本节中的其他条目不同，这个条目没有异步变体，因为它不执行查询。</p>\n</section>\n<section id=\"explain\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">explain()</span></code><a class=\"heading-anchor\" href=\"#explain\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.explain\">\n<span class=\"sig-name descname\"><span class=\"pre\">explain</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">format</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">options</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.explain\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.query.QuerySet.aexplain\">\n<span class=\"sig-name descname\"><span class=\"pre\">aexplain</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">format</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">options</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.query.QuerySet.aexplain\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><em>异步版本</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aexplain()</span></code></p>\n<p>返回一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的执行计划的字符串，它详细说明了数据库将如何执行查询，包括将使用的任何索引或联接。了解这些细节可以帮助你提高慢速查询的性能。</p>\n<p>例如，在使用 PostgreSQL 时：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;My Blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">explain</span><span class=\"p\">())</span>\n<span class=\"go\">Seq Scan on blog  (cost=0.00..35.50 rows=10 width=12)</span>\n<span class=\"go\">  Filter: (title = &#39;My Blog&#39;::bpchar)</span>\n</code></pre></div>\n<p>不同数据库之间的输出有很大的不同。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">explain()</span></code> 得到了所有内置数据库后端的支持，但 Oracle 除外，因为在那里的实现并不直接。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">format</span></code> 参数改变数据库默认的输出格式，通常是基于文本的。PostgreSQL 支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">''TEXT'</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">'JSON'</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">'YAML'</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">'XML'</span></code> 格式。MariaDB 和 MySQL 支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">''TEXT'</span></code> （也叫 <code class=\"docutils literal notranslate\"><span class=\"pre\">'TRADITIONAL'</span></code>）和 <code class=\"docutils literal notranslate\"><span class=\"pre\">'JSON'</span></code> 格式。MySQL 8.0.16+ 还支持改进的 <code class=\"docutils literal notranslate\"><span class=\"pre\">'TREE'</span></code> 格式，它类似于 PostgreSQL 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">'TEXT'</span></code> 输出，如果支持的话，默认使用。</p>\n<p>一些数据库接受可以返回有关查询的更多信息的标志。将这些标志作为关键字参数传递。例如，在使用 PostgreSQL 时：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;My Blog&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">explain</span><span class=\"p\">(</span><span class=\"n\">verbose</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">analyze</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n<span class=\"go\">Seq Scan on public.blog  (cost=0.00..35.50 rows=10 width=12) (actual time=0.004..0.004 rows=10 loops=1)</span>\n<span class=\"go\">  Output: id, title</span>\n<span class=\"go\">  Filter: (blog.title = &#39;My Blog&#39;::bpchar)</span>\n<span class=\"go\">Planning time: 0.064 ms</span>\n<span class=\"go\">Execution time: 0.058 ms</span>\n</code></pre></div>\n<p>有些数据库接受的标志可以返回更多 在一些数据库上，标志可能会导致查询被执行，这可能会对你的数据库产生不利影响。 例如，MariaDB、MySQL 8.0.18+ 和 PostgreSQL 支持的 <code class=\"docutils literal notranslate\"><span class=\"pre\">ANALYZE</span></code> 标志，如果有触发器或调用函数，即使是 <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> 查询，也可能导致数据的改变。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>已添加了 <code class=\"docutils literal notranslate\"><span class=\"pre\">aexplain()</span></code> 方法。</p>\n</aside>\n</section>\n</section>\n<section id=\"field-lookups\">\n<span id=\"id4\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> 查找<a class=\"heading-anchor\" href=\"#field-lookups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>字段查找是指定 SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> 子句的方法。它们被指定为 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 方法 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">filter()</span></code></a>、<a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exclude()</span></code></a> 和 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a> 的关键字参数。</p>\n<p>介绍见 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/queries/#field-lookups-intro\"><span class=\"std std-ref\">模型和数据库查询文档</span></a>。</p>\n<p>Django 的内置查找功能如下。也可以为模型字段写 <a class=\"reference internal\" href=\"/zh-hans/4.2/howto/custom-lookups/\"><span class=\"doc\">自定义查找</span></a>。</p>\n<p>为方便起见，当没有提供查找类型时（如 <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry.objects.get(id=14)</span></code>），查找类型被假定为 <a class=\"reference internal\" href=\"#std-fieldlookup-exact\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">exact</span></code></a>。</p>\n<section id=\"exact\">\n<span id=\"std-fieldlookup-exact\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">exact</span></code><a class=\"heading-anchor\" href=\"#exact\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>完全匹配。如果提供的比较值是 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>，它将被解释为 SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code> （详见 <a class=\"reference internal\" href=\"#std-fieldlookup-isnull\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">isnull</span></code></a>）。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">id__exact</span><span class=\"o\">=</span><span class=\"mi\">14</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">id__exact</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">14</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">IS</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">;</span>\n</code></pre></div>\n<aside class=\"admonition-mysql-comparisons admonition\">\n<p class=\"admonition-title\">MySQL 比较</p>\n<p>在 MySQL 中，数据库表的“字符序”设置决定了 <code class=\"docutils literal notranslate\"><span class=\"pre\">act</span></code> 比较是否区分大小写。这是一个数据库设置，而 <em>不是</em> Django 设置。可以配置你的 MySQL 表来使用区分大小写的比较，但是会有一些折衷。关于这方面的更多信息，请参阅 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/databases/\"><span class=\"doc\">数据库</span></a> 文档中的 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/databases/#mysql-collation\"><span class=\"std std-ref\">字符序部分</span></a>。</p>\n</aside>\n</section>\n<section id=\"iexact\">\n<span id=\"std-fieldlookup-iexact\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iexact</span></code><a class=\"heading-anchor\" href=\"#iexact\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>不区分大小写的完全匹配。如果提供的比较值是 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>，它将被解释为 SQL <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code> （详见 <a class=\"reference internal\" href=\"#std-fieldlookup-isnull\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">isnull</span></code></a>）。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name__iexact</span><span class=\"o\">=</span><span class=\"s2\">&quot;beatles blog&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name__iexact</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"k\">ILIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;beatles blog&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"k\">IS</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>注意第一个查询会匹配 <code class=\"docutils literal notranslate\"><span class=\"pre\">'Beatles</span> <span class=\"pre\">Blog'</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">'beatles</span> <span class=\"pre\">blog'</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">'BeAtLes</span> <span class=\"pre\">BLoG'</span></code> 等。</p>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>当使用 SQLite 后台和非 ASCII 字符串时，请记住 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a> 中关于字符串比较的内容。SQLite 对非 ASCII 字符串不进行区分大小写的匹配。</p>\n</aside>\n</section>\n<section id=\"std-fieldlookup-contains\">\n<span id=\"id5\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">contains</span></code><a class=\"heading-anchor\" href=\"#std-fieldlookup-contains\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>区分大小写的包含测试。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">headline__contains</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">LIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;%Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>请注意，这将与标题 <code class=\"docutils literal notranslate\"><span class=\"pre\">'Lennon</span> <span class=\"pre\">honored</span> <span class=\"pre\">today'</span></code> 相匹配，而不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">'lennon</span> <span class=\"pre\">honored</span> <span class=\"pre\">today'</span></code>。</p>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>SQLite 不支持区分大小写的 <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code> 语句；<code class=\"docutils literal notranslate\"><span class=\"pre\">contains</span></code> 的作用就像 SQLite 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">icontains</span></code>。更多信息请参见 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a>。</p>\n</aside>\n</section>\n<section id=\"icontains\">\n<span id=\"std-fieldlookup-icontains\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">icontains</span></code><a class=\"heading-anchor\" href=\"#icontains\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>不区分大小写的包含测试。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">headline__icontains</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">ILIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;%Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>当使用 SQLite 后端和非 ASCII 字符串时，请记住 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a> 中关于字符串比较的内容。</p>\n</aside>\n</section>\n<section id=\"in\">\n<span id=\"std-fieldlookup-in\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">in</span></code><a class=\"heading-anchor\" href=\"#in\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>在一个给定的可迭代对象中；通常是一个列表、元组或查询集。这不是一个常见的用例，但字符串（可迭代）是可以接受的。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">id__in</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">4</span><span class=\"p\">])</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__in</span><span class=\"o\">=</span><span class=\"s2\">&quot;abc&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">IN</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">);</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">IN</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"s1\">&#39;a&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;b&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;c&#39;</span><span class=\"p\">);</span>\n</code></pre></div>\n<p>你也可以使用一个查询集来动态计算值列表，而不是提供一个字面值列表：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">inner_qs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__contains</span><span class=\"o\">=</span><span class=\"s2\">&quot;Cheddar&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">entries</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog__in</span><span class=\"o\">=</span><span class=\"n\">inner_qs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>该查询集将作为子选择语句执行：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">blog</span><span class=\"p\">.</span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">IN</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">NAME</span><span class=\"w\"> </span><span class=\"k\">LIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;%Cheddar%&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你把一个由 <code class=\"docutils literal notranslate\"><span class=\"pre\">values()</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code> 产生的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 作为值传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">__in</span></code> 查找，你需要确保你只提取结果中的一个字段。例如，这样做就可以了（过滤博客名）：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">inner_qs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__contains</span><span class=\"o\">=</span><span class=\"s2\">&quot;Ch&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">entries</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog__name__in</span><span class=\"o\">=</span><span class=\"n\">inner_qs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这个例子会引发一个异常，因为内部查询正试图提取两个字段值，而预期只有一个：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Bad code! Will raise a TypeError.</span>\n<span class=\"n\">inner_qs</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__contains</span><span class=\"o\">=</span><span class=\"s2\">&quot;Ch&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;id&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">entries</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog__name__in</span><span class=\"o\">=</span><span class=\"n\">inner_qs</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition-performance-considerations admonition\" id=\"nested-queries-performance\">\n<p class=\"admonition-title\">性能考量</p>\n<p>谨慎使用嵌套查询，了解你的数据库服务器的性能特点（如果有疑问，请做基准测试！）。一些数据库后端，最主要的是 MySQL，并不能很好地优化嵌套查询。在这些情况下，提取一个值的列表，然后将其传递到第二个查询中会更有效率。也就是说，执行两个查询而不是一个查询：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">values</span> <span class=\"o\">=</span> <span class=\"n\">Blog</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__contains</span><span class=\"o\">=</span><span class=\"s2\">&quot;Cheddar&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">values_list</span><span class=\"p\">(</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">,</span> <span class=\"n\">flat</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"n\">entries</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog__in</span><span class=\"o\">=</span><span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>注意 Blog <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 周围的 <code class=\"docutils literal notranslate\"><span class=\"pre\">list()</span></code> 调用，以强制执行第一个查询。如果没有它，一个嵌套查询就会被执行，因为 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/queries/#querysets-are-lazy\"><span class=\"std std-ref\">QuerySet 是惰性的</span></a>。</p>\n</aside>\n</section>\n<section id=\"gt\">\n<span id=\"std-fieldlookup-gt\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">gt</span></code><a class=\"heading-anchor\" href=\"#gt\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>大于。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">id__gt</span><span class=\"o\">=</span><span class=\"mi\">4</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"p\">;</span>\n</code></pre></div>\n</section>\n<section id=\"gte\">\n<span id=\"std-fieldlookup-gte\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">gte</span></code><a class=\"heading-anchor\" href=\"#gte\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>大于等于。</p>\n</section>\n<section id=\"lt\">\n<span id=\"std-fieldlookup-lt\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">lt</span></code><a class=\"heading-anchor\" href=\"#lt\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>小于。</p>\n</section>\n<section id=\"lte\">\n<span id=\"std-fieldlookup-lte\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">lte</span></code><a class=\"heading-anchor\" href=\"#lte\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>小于等于</p>\n</section>\n<section id=\"startswith\">\n<span id=\"std-fieldlookup-startswith\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">startswith</span></code><a class=\"heading-anchor\" href=\"#startswith\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>区分大小写的开头为。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">LIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>SQLite 不支持区分大小写的 <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code> 语句；<code class=\"docutils literal notranslate\"><span class=\"pre\">startswith</span></code> 的作用就像 SQLite 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">istartswith</span></code>。</p>\n</section>\n<section id=\"istartswith\">\n<span id=\"std-fieldlookup-istartswith\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">istartswith</span></code><a class=\"heading-anchor\" href=\"#istartswith\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>不区分大小写的开头为。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__istartswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">ILIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;Lennon%&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>当使用 SQLite 后端和非 ASCII 字符串时，请记住 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a> 中关于字符串比较的内容。</p>\n</aside>\n</section>\n<section id=\"endswith\">\n<span id=\"std-fieldlookup-endswith\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">endswith</span></code><a class=\"heading-anchor\" href=\"#endswith\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>区分大小写的结尾为。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__endswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">LIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;%Lennon&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>SQLite 不支持区分大小写的 <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code> 语句；<code class=\"docutils literal notranslate\"><span class=\"pre\">endswith</span></code> 的作用类似于 SQLite 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">iendswith</span></code>。更多内容请参考 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a> 文档。</p>\n</aside>\n</section>\n<section id=\"iendswith\">\n<span id=\"std-fieldlookup-iendswith\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iendswith</span></code><a class=\"heading-anchor\" href=\"#iendswith\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>不区分大小写的结尾为。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">headline__iendswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;Lennon&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">headline</span><span class=\"w\"> </span><span class=\"k\">ILIKE</span><span class=\"w\"> </span><span class=\"s1\">&#39;%Lennon&#39;</span>\n</code></pre></div>\n<aside class=\"admonition-sqlite-users admonition\">\n<p class=\"admonition-title\">SQLite 用户</p>\n<p>当使用 SQLite 后端和非 ASCII 字符串时，请记住 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/databases/#sqlite-string-matching\"><span class=\"std std-ref\">database note</span></a> 中关于字符串比较的内容。</p>\n</aside>\n</section>\n<section id=\"range\">\n<span id=\"std-fieldlookup-range\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">range</span></code><a class=\"heading-anchor\" href=\"#range\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>范围测试（含）。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n\n<span class=\"n\">start_date</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"n\">end_date</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"mi\">31</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__range</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">start_date</span><span class=\"p\">,</span> <span class=\"n\">end_date</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"k\">BETWEEN</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-01-01&#39;</span><span class=\"w\"> </span><span class=\"k\">and</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-03-31&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>在 SQL 中，你可以在任何你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">BETWEEN</span></code> 的地方使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">range</span></code>——用于日期、数字甚至字符。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>用日期过滤 <code class=\"docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code> 不会包括最后一天的项目，因为界限被解释为“给定日期的 0 点”。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 是一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code>，上面的表达式就会变成这个 SQL：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"k\">BETWEEN</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-01-01 00:00:00&#39;</span><span class=\"w\"> </span><span class=\"k\">and</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-03-31 00:00:00&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>一般来说，你不能把日期和日期时间混在一起。</p>\n</aside>\n</section>\n<section id=\"date\">\n<span id=\"std-fieldlookup-date\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">date</span></code><a class=\"heading-anchor\" href=\"#date\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期时间字段，将值投射为日期。允许链接其他字段的查找。取一个日期值。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__date</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__date__gt</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，字段在过滤前会被转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"year\">\n<span id=\"std-fieldlookup-year\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">year</span></code><a class=\"heading-anchor\" href=\"#year\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，精确匹配年份。允许链接其他字段的查询。取整数年。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year__gte</span><span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"k\">BETWEEN</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-01-01&#39;</span><span class=\"w\"> </span><span class=\"k\">AND</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-12-31&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;2005-01-01&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"iso-year\">\n<span id=\"std-fieldlookup-iso_year\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iso_year</span></code><a class=\"heading-anchor\" href=\"#iso-year\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，精确的 ISO 8601 周号年份匹配。允许链接其他字段的查询。取整数年。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__iso_year</span><span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__iso_year__gte</span><span class=\"o\">=</span><span class=\"mi\">2005</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"month\">\n<span id=\"std-fieldlookup-month\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">month</span></code><a class=\"heading-anchor\" href=\"#month\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，精确的月份匹配。允许链接其他字段的查询。取整数 1（1 月）到 12（12 月）。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__month</span><span class=\"o\">=</span><span class=\"mi\">12</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__month__gte</span><span class=\"o\">=</span><span class=\"mi\">6</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;month&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;12&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;month&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;6&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"day\">\n<span id=\"std-fieldlookup-day\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">day</span></code><a class=\"heading-anchor\" href=\"#day\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，精确匹配日期。允许链接其他字段的查询。取整数日。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__day</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__day__gte</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;day&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;3&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;day&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;3&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>请注意，这将匹配任何带有 pub_date 的月份第三天的记录，如 1 月 3 日，7 月 3 日等。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"week\">\n<span id=\"std-fieldlookup-week\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">week</span></code><a class=\"heading-anchor\" href=\"#week\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，根据 <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/ISO-8601\">ISO-8601</a> ，返回星期号（1-52 或 53），即星期从星期一开始，第一周包含一年的第一个星期四。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__week</span><span class=\"o\">=</span><span class=\"mi\">52</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__week__gte</span><span class=\"o\">=</span><span class=\"mi\">32</span><span class=\"p\">,</span> <span class=\"n\">pub_date__week__lte</span><span class=\"o\">=</span><span class=\"mi\">38</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"week-day\">\n<span id=\"std-fieldlookup-week_day\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">week_day</span></code><a class=\"heading-anchor\" href=\"#week-day\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，“星期几”匹配。允许链接其他字段的查询。</p>\n<p>从 1（星期日）到 7（星期六）取一个整数值，代表一周的一天。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__week_day</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__week_day__gte</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>请注意，这将匹配任何带有 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 的记录，这些记录都是在星期一（一周的第 2 天）发生的，不管它发生在哪一年哪一月。周日的索引，第 1 天是周日，第 7 天是周六。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"iso-week-day\">\n<span id=\"std-fieldlookup-iso_week_day\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iso_week_day</span></code><a class=\"heading-anchor\" href=\"#iso-week-day\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，精确匹配 ISO 8601 星期几。允许链接其他字段的查询。</p>\n<p>取一个整数值，代表一周的 1（星期一）到 7（星期日）。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__iso_week_day</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__iso_week_day__gte</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>请注意，这将匹配任何带有 <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> 的记录，这些记录都是在星期一（一周的第 1 天）发生的，不管它发生在哪个月或哪个年。周日的索引是第 1 天是星期一，第 7 天是星期天。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"quarter\">\n<span id=\"std-fieldlookup-quarter\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">quarter</span></code><a class=\"heading-anchor\" href=\"#quarter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期和日期时间字段，“一年的四分之一”匹配。允许链接额外的字段查找。取 1 到 4 之间的整数值，代表一年中的季度。</p>\n<p>检索第二季度（4 月 1 日至 6 月 30 日）的条目示例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__quarter</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"time\">\n<span id=\"std-fieldlookup-time\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">time</span></code><a class=\"heading-anchor\" href=\"#time\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期时间字段，将其值强制转换为时间。允许链式附加字段查找。取一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.time\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime.time</span></code></a> 的值。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__time</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">(</span><span class=\"mi\">14</span><span class=\"p\">,</span> <span class=\"mi\">30</span><span class=\"p\">))</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__time__range</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">(</span><span class=\"mi\">8</span><span class=\"p\">),</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">(</span><span class=\"mi\">17</span><span class=\"p\">)))</span>\n</code></pre></div>\n<p>（由于不同的数据库引擎对相关查询的实现各不相同，因此本次查询不包含等效的 SQL 代码片段）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，字段在过滤前会被转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"hour\">\n<span id=\"std-fieldlookup-hour\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">hour</span></code><a class=\"heading-anchor\" href=\"#hour\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期时间和时间字段，精确的小时匹配。允许链式查找其他字段。取 0 到 23 之间的整数。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__hour</span><span class=\"o\">=</span><span class=\"mi\">23</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">time__hour</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__hour__gte</span><span class=\"o\">=</span><span class=\"mi\">12</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;hour&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;23&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;hour&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">time</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;5&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;hour&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;12&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"minute\">\n<span id=\"std-fieldlookup-minute\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">minute</span></code><a class=\"heading-anchor\" href=\"#minute\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期时间和时间字段，精确的分钟匹配。允许链式查找其他字段。取 0 到 59 之间的整数。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__minute</span><span class=\"o\">=</span><span class=\"mi\">29</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">time__minute</span><span class=\"o\">=</span><span class=\"mi\">46</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__minute__gte</span><span class=\"o\">=</span><span class=\"mi\">29</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;minute&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;29&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;minute&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">time</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;46&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;minute&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;29&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"second\">\n<span id=\"std-fieldlookup-second\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">second</span></code><a class=\"heading-anchor\" href=\"#second\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于日期时间和时间字段，完全秒配。允许链式查找其他字段。取 0 到 59 之间的整数。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__second</span><span class=\"o\">=</span><span class=\"mi\">31</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">time__second</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"n\">Event</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">timestamp__second__gte</span><span class=\"o\">=</span><span class=\"mi\">31</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;second&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;31&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;second&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">time</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">&#39;2&#39;</span><span class=\"p\">;</span>\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"k\">EXTRACT</span><span class=\"p\">(</span><span class=\"s1\">&#39;second&#39;</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"k\">timestamp</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"s1\">&#39;31&#39;</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>（确切的 SQL 语法因每个数据库引擎而异）。</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，日期时间字段会在过滤前转换为当前时区。这需要 <a class=\"reference internal\" href=\"#database-time-zone-definitions\"><span class=\"std std-ref\">数据库中的时区定义</span></a>。</p>\n</section>\n<section id=\"isnull\">\n<span id=\"std-fieldlookup-isnull\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">isnull</span></code><a class=\"heading-anchor\" href=\"#isnull\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>取 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>，分别对应 <code class=\"docutils literal notranslate\"><span class=\"pre\">IS</span> <span class=\"pre\">NULL</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">IS</span> <span class=\"pre\">NOT</span> <span class=\"pre\">NULL</span></code> 的 SQL 查询。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__isnull</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">pub_date</span><span class=\"w\"> </span><span class=\"k\">IS</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">;</span>\n</code></pre></div>\n</section>\n<section id=\"regex\">\n<span id=\"std-fieldlookup-regex\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">regex</span></code><a class=\"heading-anchor\" href=\"#regex\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>区分大小写的正则表达式匹配。</p>\n<p>正则表达式语法是使用中的数据库后端的语法。对于没有内置正则表达式支持的 SQLite 来说，这个功能是由（Python）用户定义的 REGEXP 函数提供的，因此正则表达式语法是 Python 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">re</span></code> 模块的语法。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">title__regex</span><span class=\"o\">=</span><span class=\"sa\">r</span><span class=\"s2\">&quot;^(An?|The) +&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"n\">REGEXP</span><span class=\"w\"> </span><span class=\"nb\">BINARY</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- MySQL</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">REGEXP_LIKE</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;c&#39;</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"c1\">-- Oracle</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- PostgreSQL</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"n\">REGEXP</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(An?|The) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- SQLite</span>\n</code></pre></div>\n<p>建议使用原始字符串（例如，用 <code class=\"docutils literal notranslate\"><span class=\"pre\">r'foo'</span></code> 代替 <code class=\"docutils literal notranslate\"><span class=\"pre\">'foo'</span></code>）来传递正则表达式语法。</p>\n</section>\n<section id=\"iregex\">\n<span id=\"std-fieldlookup-iregex\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">iregex</span></code><a class=\"heading-anchor\" href=\"#iregex\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>不区分大小写的正则表达式匹配。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">title__iregex</span><span class=\"o\">=</span><span class=\"sa\">r</span><span class=\"s2\">&quot;^(an?|the) +&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>SQL 等价于：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"n\">REGEXP</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(an?|the) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- MySQL</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">REGEXP_LIKE</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(an?|the) +&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;i&#39;</span><span class=\"p\">);</span><span class=\"w\"> </span><span class=\"c1\">-- Oracle</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">~*</span><span class=\"w\"> </span><span class=\"s1\">&#39;^(an?|the) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- PostgreSQL</span>\n\n<span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"p\">...</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"n\">REGEXP</span><span class=\"w\"> </span><span class=\"s1\">&#39;(?i)^(an?|the) +&#39;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"c1\">-- SQLite</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"aggregation-functions\">\n<span id=\"id6\"></span><h3>聚合函数<a class=\"heading-anchor\" href=\"#aggregation-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django 在 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models</span></code> 模块中提供了以下聚合函数。关于如何使用这些聚合函数的细节，请参见 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/aggregation/\"><span class=\"doc\">关于聚合的主题指南</span></a>。参见 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/expressions/#django.db.models.Aggregate\" title=\"django.db.models.Aggregate\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Aggregate</span></code></a> 文档，了解如何创建你的聚合函数。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>SQLite 无法处理日期／时间字段的聚合。这是因为 SQLite 中没有原生的日期／时间字段，而 Django 目前使用文本字段来模拟这些功能。试图在 SQLite 中使用日期／时间字段上的聚合将引发 <code class=\"docutils literal notranslate\"><span class=\"pre\">NotSupportedError</span></code>。</p>\n</aside>\n<aside class=\"admonition-empty-querysets-or-groups admonition\">\n<p class=\"admonition-title\">空的查询集或分组</p>\n<p>聚合函数在与空的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 或分组一起使用时会返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>。例如，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 不包含任何条目或在非空的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 中有任何空分组时，<code class=\"docutils literal notranslate\"><span class=\"pre\">Sum</span></code> 聚合函数将返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> 而不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code>。要返回另一个值，可以定义 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 参数。 <code class=\"docutils literal notranslate\"><span class=\"pre\">Count</span></code> 是这种行为的一个例外；如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 为空，它将返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code>，因为 <code class=\"docutils literal notranslate\"><span class=\"pre\">Count</span></code> 不支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 参数。</p>\n</aside>\n<p>所有聚合体都有以下共同的参数：</p>\n<section id=\"expressions\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">expressions</span></code><a class=\"heading-anchor\" href=\"#expressions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>引用模型上的字段的字符串，字段的转换，或 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/expressions/\"><span class=\"doc\">查询表达式</span></a>。</p>\n</section>\n<section id=\"output-field\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code><a class=\"heading-anchor\" href=\"#output-field\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>一个可选的参数，表示返回值的 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/fields/\"><span class=\"doc\">模型字段</span></a></p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>当组合多个字段类型时，Django 只能在所有字段类型相同的情况下确定 <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code>。否则，你必须自己提供 <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code>。</p>\n</aside>\n</section>\n<section id=\"aggregate-filter\">\n<span id=\"id7\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">filter</span></code><a class=\"heading-anchor\" href=\"#aggregate-filter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>一个可选的 <a class=\"reference internal\" href=\"#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Q</span> <span class=\"pre\">对象</span></code></a>，用于过滤被聚合的行。</p>\n<p>参见 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/conditional-expressions/#conditional-aggregation\"><span class=\"std std-ref\">条件聚合</span></a> 和 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/aggregation/#filtering-on-annotations\"><span class=\"std std-ref\">过滤注解</span></a> 的用法示例。</p>\n</section>\n<section id=\"default\">\n<span id=\"aggregate-default\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code><a class=\"heading-anchor\" href=\"#default\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>一个可选的参数，允许指定一个值作为默认值，当查询集（或分组）不包含条目时使用。</p>\n</section>\n<section id=\"id8\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">**extra</span></code><a class=\"heading-anchor\" href=\"#id8\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>关键字参数，可以为聚合生成的 SQL 提供额外的上下文。</p>\n</section>\n<section id=\"avg\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Avg</span></code><a class=\"heading-anchor\" href=\"#avg\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Avg\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Avg</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">distinct</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Avg\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给定表达式的平均值，除非指定不同的 <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code>，否则必须是数值。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;field&gt;__avg</span></code></p></li>\n<li><p>返回类型：如果输入是 <code class=\"docutils literal notranslate\"><span class=\"pre\">int</span></code>，则返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">float</span></code>，否则返回与输入字段相同的类型，或者如果提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>。</p></li>\n</ul>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Avg.distinct\">\n<span class=\"sig-name descname\"><span class=\"pre\">distinct</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Avg.distinct\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>可选。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct=True</span></code>，则 <code class=\"docutils literal notranslate\"><span class=\"pre\">Avg</span></code> 返回唯一值的平均值。这相当于 SQL 中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">AVG(DISTINCT</span> <span class=\"pre\">&lt;field&gt;)</span></code>。默认值是 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"id9\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Count</span></code><a class=\"heading-anchor\" href=\"#id9\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Count\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Count</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">distinct</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Count\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回通过提供的表达式相关联的对象数量。 <code class=\"docutils literal notranslate\"><span class=\"pre\">Count('*')</span></code> 等同于 SQL 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">COUNT(*)</span></code> 表达式。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;field&gt;__count</span></code></p></li>\n<li><p>返回类型：<code class=\"docutils literal notranslate\"><span class=\"pre\">int</span></code></p></li>\n</ul>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Count.distinct\">\n<span class=\"sig-name descname\"><span class=\"pre\">distinct</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Count.distinct\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>可选。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct=True</span></code>，计数将仅包括唯一的实例。这相当于 SQL 中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">COUNT(DISTINCT</span> <span class=\"pre\">&lt;field&gt;)</span></code>。默认值是 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>。</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>不支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 参数。</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"max\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Max</span></code><a class=\"heading-anchor\" href=\"#max\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Max\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Max</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Max\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给定表达式的最大值。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;field&gt;__max</span></code></p></li>\n<li><p>返回类型：与输入字段相同，或者如果提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>。</p></li>\n</ul>\n</dd></dl>\n\n</section>\n<section id=\"min\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Min</span></code><a class=\"heading-anchor\" href=\"#min\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Min\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Min</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Min\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给定表达式的最小值。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;field&gt;__min</span></code></p></li>\n<li><p>返回类型：与输入字段相同，或者如果提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>。</p></li>\n</ul>\n</dd></dl>\n\n</section>\n<section id=\"stddev\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">StdDev</span></code><a class=\"heading-anchor\" href=\"#stddev\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.StdDev\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">StdDev</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">sample</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.StdDev\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给定表达式中数据的标准差。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;field&gt;__stddev</span></code></p></li>\n<li><p>返回类型：如果输入是 <code class=\"docutils literal notranslate\"><span class=\"pre\">int</span></code>，则返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">float</span></code>，否则返回与输入字段相同的类型，或者如果提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>。</p></li>\n</ul>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.StdDev.sample\">\n<span class=\"sig-name descname\"><span class=\"pre\">sample</span></span><a class=\"heading-anchor\" href=\"#django.db.models.StdDev.sample\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>可选。默认情况下，<code class=\"docutils literal notranslate\"><span class=\"pre\">StdDev</span></code> 返回总体标准差。然而，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">sample=True</span></code>，返回值将是样本标准差。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"sum\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Sum</span></code><a class=\"heading-anchor\" href=\"#sum\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Sum\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Sum</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">distinct</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Sum\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>计算给定表达式的所有值的总和。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;field&gt;__sum</span></code></p></li>\n<li><p>返回类型：与输入字段相同，或者如果提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>。</p></li>\n</ul>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Sum.distinct\">\n<span class=\"sig-name descname\"><span class=\"pre\">distinct</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Sum.distinct\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>可选。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct=True</span></code>，<code class=\"docutils literal notranslate\"><span class=\"pre\">Sum</span></code> 返回唯一值的总和。这相当于 SQL 中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">SUM(DISTINCT</span> <span class=\"pre\">&lt;field&gt;)</span></code>。默认值是 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"variance\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Variance</span></code><a class=\"heading-anchor\" href=\"#variance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Variance\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Variance</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">output_field</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">sample</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">filter</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Variance\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给定表达式中数据的方差。</p>\n<ul class=\"simple\">\n<li><p>默认别名：<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;field&gt;__variance</span></code></p></li>\n<li><p>返回类型：如果输入是 <code class=\"docutils literal notranslate\"><span class=\"pre\">int</span></code>，则返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">float</span></code>，否则返回与输入字段相同的类型，或者如果提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">output_field</span></code>，则返回它。如果查询集或分组为空，将返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>。</p></li>\n</ul>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Variance.sample\">\n<span class=\"sig-name descname\"><span class=\"pre\">sample</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Variance.sample\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>可选。默认情况下，<code class=\"docutils literal notranslate\"><span class=\"pre\">Variance</span></code> 返回总体方差。然而，如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">sample=True</span></code>，返回值将是样本方差。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n</section>\n</section>\n<section id=\"query-related-tools\">\n<h2>查询相关工具<a class=\"heading-anchor\" href=\"#query-related-tools\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>本节提供了与查询相关的工具的参考资料，其他地方没有记载。</p>\n<section id=\"q-objects\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">Q()</span></code> 对象<a class=\"heading-anchor\" href=\"#q-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Q\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Q</span></span><a class=\"heading-anchor\" href=\"#django.db.models.Q\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Q()</span></code> 对象表示一个可以在与数据库相关的操作中使用的 SQL 条件。它类似于 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/models/expressions/#django.db.models.F\" title=\"django.db.models.F\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">F()</span></code></a> 对象，它表示模型字段或注释的值。它们使得定义和重复使用条件成为可能，并可以使用操作符如 <code class=\"docutils literal notranslate\"><span class=\"pre\">|</span></code> （<code class=\"docutils literal notranslate\"><span class=\"pre\">OR</span></code>）、<code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;</span></code> （<code class=\"docutils literal notranslate\"><span class=\"pre\">AND</span></code>）和 <code class=\"docutils literal notranslate\"><span class=\"pre\">^</span></code> （<code class=\"docutils literal notranslate\"><span class=\"pre\">XOR</span></code>）来组合它们。请参阅 <a class=\"reference internal\" href=\"/zh-hans/4.2/topics/db/queries/#complex-lookups-with-q\"><span class=\"std std-ref\">通过 Q 对象完成复杂查询</span></a>。</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">^</span></code> （<code class=\"docutils literal notranslate\"><span class=\"pre\">XOR</span></code>）运算符已添加。</p>\n</aside>\n</section>\n<section id=\"prefetch-objects\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">Prefetch()</span></code> 对象<a class=\"heading-anchor\" href=\"#prefetch-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Prefetch\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Prefetch</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">lookup</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">queryset</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">to_attr</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Prefetch\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Prefetch()</span></code> 对象可以用来控制 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code> 的操作。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">lookup</span></code> 参数描述了要遵循的关系，并且与传递给 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.prefetch_related\" title=\"django.db.models.query.QuerySet.prefetch_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code></a> 的基于字符串的查找相同。 例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Prefetch</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;choice_set&#39;</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n<span class=\"go\"># This will only execute two queries regardless of the number of Question</span>\n<span class=\"go\"># and Choice objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;choice_set&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</span></code> 参数为给定的查询提供基本的 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>。 这对于进一步过滤预取操作或从预取关系中调用 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> 很有用，从而进一步减少了查询数量：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">voted_choices</span> <span class=\"o\">=</span> <span class=\"n\">Choice</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">votes__gt</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">voted_choices</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: The sky&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">prefetch</span> <span class=\"o\">=</span> <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;choice_set&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">voted_choices</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">prefetch</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: The sky&gt;]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">to_attr</span></code> 参数将预取操作的结果设置为自定义属性：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">prefetch</span> <span class=\"o\">=</span> <span class=\"n\">Prefetch</span><span class=\"p\">(</span><span class=\"s1\">&#39;choice_set&#39;</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"o\">=</span><span class=\"n\">voted_choices</span><span class=\"p\">,</span> <span class=\"n\">to_attr</span><span class=\"o\">=</span><span class=\"s1\">&#39;voted_choices&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">prefetch</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">voted_choices</span>\n<span class=\"go\">[&lt;Choice: The sky&gt;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Question</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">prefetch_related</span><span class=\"p\">(</span><span class=\"n\">prefetch</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">choice_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>当使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">to_attr</span></code> 时，预取结果存储在列表中。 与传统的 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> 调用相比，这可以显着提高速度，传统的 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related</span></code> 调用将缓存的结果存储在 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 实例中。</p>\n</aside>\n</section>\n<section id=\"prefetch-related-objects\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related_objects()</span></code><a class=\"heading-anchor\" href=\"#prefetch-related-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.prefetch_related_objects\">\n<span class=\"sig-name descname\"><span class=\"pre\">prefetch_related_objects</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_instances</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">related_lookups</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.prefetch_related_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在作为模型实例的可迭代对象上预取给定的查找。这在接收模型实例列表而不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> 的代码中很有用；例如，从缓存中获取模型或手动实例化它们时。</p>\n<p>传递一个模型实例的可迭代对象（必须都是同一类），以及你想要预取的查找或 <a class=\"reference internal\" href=\"#django.db.models.Prefetch\" title=\"django.db.models.Prefetch\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Prefetch</span></code></a> 对象。例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">prefetch_related_objects</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">restaurants</span> <span class=\"o\">=</span> <span class=\"n\">fetch_top_restaurants_from_cache</span><span class=\"p\">()</span>  <span class=\"c1\"># A list of Restaurants</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">prefetch_related_objects</span><span class=\"p\">(</span><span class=\"n\">restaurants</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pizzas__toppings&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>当使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related_objects</span></code> 的多个数据库时，预取查询将使用与模型实例相关的数据库。这可以通过在相关查找中使用自定义查询集来覆盖。</p>\n</section>\n<section id=\"filteredrelation-objects\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">FilteredRelation()</span></code> 对象<a class=\"heading-anchor\" href=\"#filteredrelation-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.FilteredRelation\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">FilteredRelation</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">relation_name</span></span></em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">condition</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">Q()</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.FilteredRelation\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.FilteredRelation.relation_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">relation_name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.FilteredRelation.relation_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>你想过滤关系的字段名。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.FilteredRelation.condition\">\n<span class=\"sig-name descname\"><span class=\"pre\">condition</span></span><a class=\"heading-anchor\" href=\"#django.db.models.FilteredRelation.condition\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个 <a class=\"reference internal\" href=\"#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Q</span></code></a> 对象来控制过滤。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">FilteredRelation</span></code> 与 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a> 一起使用，在执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">JOIN</span></code> 时创建一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">ON</span></code> 子句。它不作用于默认的关系，而是作用于注解名称（下面例子中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">pizzas_vegetarian</span></code>）。</p>\n<p>例如，要查找具有在名称中包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">'mozzarella'</span></code> 的素食比萨的餐馆：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FilteredRelation</span><span class=\"p\">,</span> <span class=\"n\">Q</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">pizzas_vegetarian</span><span class=\"o\">=</span><span class=\"n\">FilteredRelation</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"s2\">&quot;pizzas&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"n\">condition</span><span class=\"o\">=</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">pizzas__vegetarian</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pizzas_vegetarian__name__icontains</span><span class=\"o\">=</span><span class=\"s2\">&quot;mozzarella&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果有大量的比萨，这个查询集的性能要优于：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Restaurant</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">pizzas__vegetarian</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">pizzas__name__icontains</span><span class=\"o\">=</span><span class=\"s2\">&quot;mozzarella&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>因为第一个查询集的 <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span></code> 子句中的过滤只对素食披萨进行操作。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">FilteredRelation</span></code> 不支持：</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.only()</span></code></a> 和 <a class=\"reference internal\" href=\"#django.db.models.query.QuerySet.prefetch_related\" title=\"django.db.models.query.QuerySet.prefetch_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code></a>。</p></li>\n<li><p>一个从父模型继承的 <a class=\"reference internal\" href=\"/zh-hans/4.2/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey\" title=\"django.contrib.contenttypes.fields.GenericForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code></a>。</p></li>\n</ul>\n</section>\n</section>","rootId":"queryset-api-reference","toc":[{"title":"什么时候 QuerySet 被执行","anchor":"when-querysets-are-evaluated","children":[{"title":"Pickle 序列化 QuerySet","anchor":"pickling-querysets","children":[]}]},{"title":"QuerySet API","anchor":"queryset-api","children":[{"title":"返回新 QuerySet 的方法","anchor":"methods-that-return-new-querysets","children":[{"title":"filter()","anchor":"filter","children":[]},{"title":"exclude()","anchor":"exclude","children":[]},{"title":"annotate()","anchor":"annotate","children":[]},{"title":"alias()","anchor":"alias","children":[]},{"title":"order_by()","anchor":"order-by","children":[]},{"title":"reverse()","anchor":"reverse","children":[]},{"title":"distinct()","anchor":"distinct","children":[]},{"title":"values()","anchor":"values","children":[]},{"title":"values_list()","anchor":"values-list","children":[]},{"title":"dates()","anchor":"dates","children":[]},{"title":"datetimes()","anchor":"datetimes","children":[]},{"title":"none()","anchor":"none","children":[]},{"title":"all()","anchor":"all","children":[]},{"title":"union()","anchor":"union","children":[]},{"title":"intersection()","anchor":"intersection","children":[]},{"title":"difference()","anchor":"difference","children":[]},{"title":"select_related()","anchor":"select-related","children":[]},{"title":"prefetch_related()","anchor":"prefetch-related","children":[]},{"title":"extra()","anchor":"extra","children":[]},{"title":"defer()","anchor":"defer","children":[]},{"title":"only()","anchor":"only","children":[]},{"title":"using()","anchor":"using","children":[]},{"title":"select_for_update()","anchor":"select-for-update","children":[]},{"title":"raw()","anchor":"raw","children":[]}]},{"title":"返回新 QuerySet 的操作符","anchor":"operators-that-return-new-querysets","children":[{"title":"AND（&）","anchor":"and","children":[]},{"title":"OR（|）","anchor":"or","children":[]},{"title":"XOR (^)","anchor":"xor","children":[]}]},{"title":"不返回 QuerySet 的方法","anchor":"methods-that-do-not-return-querysets","children":[{"title":"get()","anchor":"get","children":[]},{"title":"create()","anchor":"create","children":[]},{"title":"get_or_create()","anchor":"get-or-create","children":[]},{"title":"update_or_create()","anchor":"update-or-create","children":[]},{"title":"bulk_create()","anchor":"bulk-create","children":[]},{"title":"bulk_update()","anchor":"bulk-update","children":[]},{"title":"count()","anchor":"count","children":[]},{"title":"in_bulk()","anchor":"in-bulk","children":[]},{"title":"iterator()","anchor":"iterator","children":[{"title":"使用服务器端游标","anchor":"with-server-side-cursors","children":[]},{"title":"没有服务器端游标","anchor":"without-server-side-cursors","children":[]}]},{"title":"latest()","anchor":"latest","children":[]},{"title":"earliest()","anchor":"earliest","children":[]},{"title":"first()","anchor":"first","children":[]},{"title":"last()","anchor":"last","children":[]},{"title":"aggregate()","anchor":"aggregate","children":[]},{"title":"exists()","anchor":"exists","children":[]},{"title":"contains()","anchor":"contains","children":[]},{"title":"update()","anchor":"update","children":[{"title":"有序的查询集","anchor":"ordered-queryset","children":[]}]},{"title":"delete()","anchor":"delete","children":[]},{"title":"as_manager()","anchor":"as-manager","children":[]},{"title":"explain()","anchor":"explain","children":[]}]},{"title":"Field 查找","anchor":"field-lookups","children":[{"title":"exact","anchor":"exact","children":[]},{"title":"iexact","anchor":"iexact","children":[]},{"title":"contains","anchor":"std-fieldlookup-contains","children":[]},{"title":"icontains","anchor":"icontains","children":[]},{"title":"in","anchor":"in","children":[]},{"title":"gt","anchor":"gt","children":[]},{"title":"gte","anchor":"gte","children":[]},{"title":"lt","anchor":"lt","children":[]},{"title":"lte","anchor":"lte","children":[]},{"title":"startswith","anchor":"startswith","children":[]},{"title":"istartswith","anchor":"istartswith","children":[]},{"title":"endswith","anchor":"endswith","children":[]},{"title":"iendswith","anchor":"iendswith","children":[]},{"title":"range","anchor":"range","children":[]},{"title":"date","anchor":"date","children":[]},{"title":"year","anchor":"year","children":[]},{"title":"iso_year","anchor":"iso-year","children":[]},{"title":"month","anchor":"month","children":[]},{"title":"day","anchor":"day","children":[]},{"title":"week","anchor":"week","children":[]},{"title":"week_day","anchor":"week-day","children":[]},{"title":"iso_week_day","anchor":"iso-week-day","children":[]},{"title":"quarter","anchor":"quarter","children":[]},{"title":"time","anchor":"time","children":[]},{"title":"hour","anchor":"hour","children":[]},{"title":"minute","anchor":"minute","children":[]},{"title":"second","anchor":"second","children":[]},{"title":"isnull","anchor":"isnull","children":[]},{"title":"regex","anchor":"regex","children":[]},{"title":"iregex","anchor":"iregex","children":[]}]},{"title":"聚合函数","anchor":"aggregation-functions","children":[{"title":"expressions","anchor":"expressions","children":[]},{"title":"output_field","anchor":"output-field","children":[]},{"title":"filter","anchor":"aggregate-filter","children":[]},{"title":"default","anchor":"default","children":[]},{"title":"**extra","anchor":"id8","children":[]},{"title":"Avg","anchor":"avg","children":[]},{"title":"Count","anchor":"id9","children":[]},{"title":"Max","anchor":"max","children":[]},{"title":"Min","anchor":"min","children":[]},{"title":"StdDev","anchor":"stddev","children":[]},{"title":"Sum","anchor":"sum","children":[]},{"title":"Variance","anchor":"variance","children":[]}]}]},{"title":"查询相关工具","anchor":"query-related-tools","children":[{"title":"Q() 对象","anchor":"q-objects","children":[]},{"title":"Prefetch() 对象","anchor":"prefetch-objects","children":[]},{"title":"prefetch_related_objects()","anchor":"prefetch-related-objects","children":[]},{"title":"FilteredRelation() 对象","anchor":"filteredrelation-objects","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/4.2/ref/"},{"docname":"ref/models/index","title":"模型","url":"/zh-hans/4.2/ref/models/"}],"prev":{"docname":"ref/models/instances","title":"模型实例参考","url":"/zh-hans/4.2/ref/models/instances/"},"next":{"docname":"ref/models/lookups","title":"查找 API 参考","url":"/zh-hans/4.2/ref/models/lookups/"},"formats":{"html":"/zh-hans/4.2/ref/models/querysets/","markdown":"/zh-hans/4.2/ref/models/querysets.md","json":"/zh-hans/4.2/ref/models/querysets.json"},"source":"https://github.com/django/django/blob/stable/4.2.x/docs/ref/models/querysets.txt","official":"https://docs.djangoproject.com/zh-hans/4.2/ref/models/querysets/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}